などのコレクションがある場合Collection<String> strs
、最初のアイテムを取り出すにはどうすればよいですか? を呼び出してIterator
、最初の を取りnext()
、次に を捨てることができIterator
ます。無駄の少ない方法はありますか?
14 に答える
それが最善の方法のようです:
String first = strs.iterator().next();
Collection
素晴らしい質問です...最初は、インターフェースの見落としのように思えます。
「最初」は、コレクションに最初に入れたものを常に返すとは限らず、順序付けられたコレクションに対してのみ意味があることに注意してください。get(item)
順序が必ずしも保存されているとは限らないため、呼び出しがないのはそのためかもしれません。
少し無駄に思えるかもしれませんが、思ったほど悪くはないかもしれません。Iterator
には、通常はコレクション全体のコピーではなく、コレクションへのインデックス情報が含まれているだけです。このメソッドを呼び出すとIterator
オブジェクトがインスタンス化されますが、実際にはそれが唯一のオーバーヘッドです (すべての要素をコピーするのとは異なります)。
たとえば、ArrayList<String>.iterator()
メソッドによって返される型を見ると、それが であることがわかりますArrayList::Itr
。これは、リストの要素をコピーするのではなく、直接アクセスするだけの内部クラスです。
空であるか、実装に依存するiterator()
可能性があるため、 の戻り値を必ず確認してください。null
Iterables.get(yourC、indexYouWant)
実際、コレクションを使用している場合は、Googleコレクションを使用する必要があるためです。
Java 8 の場合:
Optional<String> firstElement = collection.stream().findFirst();
古いバージョンの Java では、Guava Iterablesに getFirst メソッドがあります。
Iterables.getFirst(iterable, defaultValue)
単にコレクションであるため、「最初の」アイテムなどはありませんCollection
。
Java ドキュメントのCollection.iterator()メソッドから:
要素が返される順序に関する保証はありません...
だから、できません。
Listなどの別のインターフェースを使用する場合は、次のことができます。
String first = strs.get(0);
ただし、コレクションから直接これを行うことはできません。
あなたのコレクションはリストのようになりたいと思われるので、次のことをお勧めします。
List<String> myList = new ArrayList<String>();
...
String first = myList.get(0);
コレクションがキューであることがわかっている場合は、コレクションをキューにキャストして簡単に取得できます。
順序を取得するために使用できる構造がいくつかありますが、それにキャストする必要があります。
それは、使用した実装、arraylistlinkedlist、または set の他の実装に完全に依存します。
設定されている場合は、最初の要素を直接取得できます。それらは、コレクションのトリック ループであり、値 1 の変数を作成し、フラグ値が 1 のときに値を取得した後、そのループを中断します。
リストの実装であれば、インデックス番号を定義することで簡単です。
Apache Commons Collections 4 を使用している場合は、IterableUtils.first
方法があります。sの場合の最適化が含まれており、List
使いやすいです。Guava メソッドと非常によく似ています。コードは次のようになります
String firstStr = IterableUtils.first(strs);
あなたはこれを行うことができます:
String strz[] = strs.toArray(String[strs.size()]);
String theFirstOne = strz[0];
Collection の javadoc には、配列の要素の順序に関する次の注意事項があります。
このコレクションがイテレータによって返される要素の順序を保証する場合、このメソッドは要素を同じ順序で返す必要があります。