1

foreach ループ内での LinkedList の動作についてはよくわかりません。例えば:

LinkedList<Apple> apples = new LinkedList<Apple>();

public Apple apple(String colour) {
    for (Apple apple : apples) {
        if (apple.getColour().equals(colour)) {
            dosomething();
            return apple;
        }
    }
    return null;
}

特定の順序ではなく、多くの赤いリンゴがリストに散らばっていると想像してください。このように呼び出されると:

apple("Red");

.. 最初の赤いリンゴを返すか、最後の赤いリンゴを返すか? そうでない場合、それはどのように正確に動作しますか?

4

3 に答える 3

5

拡張 for ループは、リストの先頭から末尾に移動する反復子のように動作します。条件に一致する最初の要素に作用します。

これは、のサブタイプであるすべてのものに当てはまりIterableます。つまり、 を生成できるものすべてですIterator。したがって、Collectionクラスはカバーされています。

イラスト: あなたの Enhanced-for は隠れてこれをやっています:

for(Iterator<Apple> iterator = apples.iterator(); iterator.hasNext();) {
    Apple apple = iterator.next();
    if(apple.getColour().equals(colour)) {
        dosomething();
        return apple;
    }
 }
于 2013-09-02T00:02:28.853 に答える
1

LinkedList<E>定義された順序を持つコンテナです。その反復順序は、項目がリストに追加された順序に対応します。for要求された色のリンゴが見つかるとすぐにループが終了するため、最初の赤いリンゴが返されます。もちろん、リストに赤いリンゴが含まれていない場合は、nullが返されます。

他の種類のリスト (配列リストなど) についても同じことが言えます。ただし、他のコンテナは異なる動作をする場合があります。たとえばTreeSet<E>、挿入順序とは異なる可能性がある方法で要素を順序付けます。HashSet<E>その要素を任意の順序で返します。

于 2013-09-02T00:05:09.270 に答える
1

for each ループは、 Iterable インターフェースの iterator メソッドを使用して、反復するコレクションの反復子を取得します。LinkedListの Javadoc を見ると、その iterator() メソッドが AbstractSequentialList クラスから継承されていることがわかります。イテレータ()

そのドキュメントには次のように記載されています。

このリスト内の要素に対する反復子を (適切な順序で) 返します。

はい、最初の赤いリンゴを手に入れます。

于 2013-09-02T00:06:56.670 に答える