web-dev-qa-db-ja.com

Java:コレクションから最初のアイテムを入手する

Collection<String> strsのようなコレクションを持っている場合、どうやって最初のアイテムを取り出すことができますか?私はただIteratorを呼び、最初のnext()を取り、そしてIteratorを捨てることができます。それをするためのより無駄の少ない方法はありますか?

243
Nick Heiner

Iterables.get(あなたの、インデックスが欲しい)

コレクションを使用しているのであれば、実際にはGoogleコレクションを使用しているはずです。

117
Carl

それがそれをするための最良の方法であるように見えます:

String first = strs.iterator().next();

大変な質問ですが...最初は、Collectionインターフェースの見落としのようです。

"first"は常にコレクションに最初に入れたものを返すわけではなく、順序付けられたコレクションに対してのみ意味がある場合があります。たぶんそれがget(item)呼び出しがない理由です、なぜなら順序は必ずしも保存されないからです。

それは少し無駄に思えるかもしれませんが、それはあなたが思うほど悪くないかもしれません。 Iteratorは実際にはコレクション内のインデックス情報を含んでいるだけで、通常はコレクション全体のコピーではありません。このメソッドを呼び出すとIteratorオブジェクトがインスタンス化されますが、それが実際に唯一のオーバーヘッドです(すべての要素をコピーするのとは異なります)。

たとえば、ArrayList<String>.iterator()メソッドによって返される型を見ると、それがArrayList::Itrであることがわかります。これは、コピーするのではなく、単にリストの要素に直接アクセスする内部クラスです。

実装によっては空またはnullになる可能性があるため、iterator()の戻り値を必ず確認してください。

385
jheddings

Java 8の場合:

Optional<String> firstElement = collection.stream().findFirst();

古いバージョンのJavaでは、GuavaにgetFirstメソッドがあります Iterables

Iterables.getFirst(iterable, defaultValue)
74

Collectionには「最初の」項目というものはありません。それは単なるコレクションだからです。

Javaドキュメントの Collection.iterator() メソッドから:

要素が返される順序に関する保証はありません...

だからできません。

Listのような他のインターフェースを使用すると、次のことができます。

String first = strs.get(0);

しかし、コレクションから直接これを行うことはできません。

38
OscarRyz

あなたのコレクションはリストのようになりたいと思うので、私はお勧めします:

List<String> myList = new ArrayList<String>();
...
String first = myList.get(0);
4
Jim Ferrans

Java 8では、limitのように、使用する演算子がいくつかあります。

     /**
 * Operator that limit the total number of items emitted through the pipeline
 * Shall print
 * [1]
 * @throws InterruptedException
 */
@Test
public void limitStream() throws InterruptedException {
    List<Integer> list = Arrays.asList(1, 2, 3, 1, 4, 2, 3)
                               .stream()
                               .limit(1)
                               .collect(toList());
    System.out.println(list);
}
2
paul

あなたはキャスティングをすることができます。たとえば、この定義を持つメソッドが1つ存在し、このメソッドがListを返していることがわかります。

Collection<String> getStrings();

そしてそれを呼び出した後、あなたは最初の要素が必要です、あなたはこのようにそれをすることができます:

List<String> listString = (List) getStrings();
String firstElement = (listString.isEmpty() ? null : listString.get(0));
1
Nacho Soriano

GuavaはonlyElementCollectorを提供しますが、コレクションがちょうど1つの要素を持つことを期待する場合にのみそれを使用してください。

Collection<String> stringCollection = ...;
String string = collection.stream().collect(MoreCollectors.onlyElement())

要素の数がわからない場合は、findFirstを使用してください。

Optional<String> optionalString = collection.stream().findFirst();
0
cambunctious

それは完全にあなたがどの実装を使ったか、arraylist linkedlist、あるいは他のsetの実装に依存します。

それが設定されているならば、あなたは直接最初の要素を得ることができます、そして、それらはコレクションの上でトリックループであることができます。

それがリストの実装であるならば、それはインデックス番号を定義することによって簡単です。

0
Sindhoo Oad

コレクションがキューであることがわかっている場合は、コレクションをキューにキャストして簡単に取得できます。

注文を取得するために使用できる構造はいくつかありますが、それにキャストする必要があります。

0
James Black