JavaコレクションAPIに最後のメソッドがないのはなぜですか?[閉まっている]


19

これは、java.util.Listなどの順序付きコレクション用です。言語設計者が最後のメソッドを含めなかったのはなぜですか?私が考えることができる唯一の理由は次のとおりです。

  • コレクションが空の場合のあいまいさ(nullを返すか、例外をスローします)
  • APIの膨張

他の理由は?


9
+1する必要がありますcollection.get(collection.size() - 1)
-jprete

1
このメソッドと、コレクションで使用したい他のメソッドを持つ独自のユーティリティクラスを作成してみませんか?
マフムードホッサム

7
first()メソッドもないので、なぜlast()メソッドが必要なのでしょうか?
ピーターテイラー

6
@Peter urgh getLast()を実装しないよりも悪いのは、get(-1)のようなハックで実装することだけです。
アルプ

2
@Alb「ハック」は見る人の目にあると思います:)この時点で、Pythonの-1構文に感謝しています。もちろん、将来または過去のある時期にもう一度私に尋ねた場合、私はあなたと同じように感じるかもしれません。
3カップ

回答:


13

APIの肥大化がおそらく答えです。私の経験から、この機能が必要なのはキューまたはスタックが適切なメソッドを持つジョブの正しいデータ構造であったときだけでした。


部分的に正しいと思いますが、Javaがget(-1)リストの末尾からの取得をサポートしていれば、APIの肥大化を追加することなくOPが望んでいたことを実行できます。そのようなものとしての私の答えは、説明のつかない下票を引き付けました。
user949300 14

1
より大きな答えは、デフォルトのインターフェースメソッドをサポートするJavaの最初の失敗(。上のすべての異なっそれらを実装しているいくつかの利益のために実装。
supercat

16

last()この方法は、同じように簡単ですlist.get(list.size()-1)何が存在しないと同じように、first()方法またはfifth()方法。合成するのはそれほど難しくなく、専門分野です。reverse()リストをlist.get(0)使用して、lastアイテムを提供することもできます。簡単にできることは、通常、独自の特殊なメソッドを取得しません。

import java.util.ArrayList;
import java.util.List;

public class Main
{
    public static void main(String[] args)
    {
        final List<String> l = new ArrayList<String>();

        l.add("A");
        l.add("B");
        l.add("Z");

        System.out.println("l.get(0) = " + l.get(0));
        System.out.println("l.get(l.size()-1) = " + l.get(l.size() - 1));
    }
}

次の出力になります

l.get(0) = A
l.get(l.size()-1) = Z

また、Listインターフェイスを実装するすべてのものが実際にlast()何かの概念を持っていると仮定することは、ばかげています。


1
ただし、どちらの場合でも明確になります
アント

コレクションがまだ完全に読み込まれていない場合、size()メソッドは応答できない場合があることに注意してください。

1
.size().size()-1関係なく、現在のサイズが引き続き最後の要素になりますが、完全に読み込まれたかどうかをどのように知るのでしょうか?

1
仕様では、ListにはInteger.MAX_VALUEを超える要素を含めることができます。この場合、size()はInteger.MAX_VALUEを返すため.size()-1、実装するのに最適な方法ではありませんlast()(ただし、このような大きなリストはほとんどありません。実装しtoArray()ます...)
user281377

1
C#には.First&.Lastメソッドがあります。最後のアイテムを取得するためだけにリストを逆にすることも、正確には効率的ではありません。
カーラ

5

java.util.LinkedList定義getLast()及びgetFirst()方法。残念ながら、これらのメソッドはインターフェースの1つで定義されていないため、LinkedList型を使用する必要があります。最後の要素のみに関心がある場合は、java.util.Queueインターフェイスのpeek()メソッドを使用することを検討してください。LinkedListはキューを実装します。


0

基本的にsize()は、for-ループを要求するか、イテレータを要求して反復し、whileまたはdoループで使用する必要があります。目的に適したものを使用してください。

イテレータは、さらにエントリがあるかどうかを特定の時点で認識し、存在する場合は次のエントリを取得できます。その後、「エントリが増えましたか?」まで繰り返す。失敗します。

http://download.oracle.com/javase/tutorial/collections/interfaces/collection.htmlの「コレクションの探索」セクションを参照してください。


これは質問に対する答えではありません。また、反復子を使用してリストの最後の要素を見つけることは非常に非効率的です。
fishinear
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.