1

Java のイテレータの動作について質問があります。

次のような電話があります。

myIterable.iterator().hasNext()

この呼び出しが true を返す場合、コレクションに少なくとも 2 つの要素があることを確認できますか? Java API 仕様から、 true は で到達できる要素がもう 1 つあることを意味することしかわかりませんでしたnext()。しかし、ポインターが一番最初にある場合はどうなりますか (hasNext()が最初の要素を個別に認識できるかどうかを意味します)。

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Iterator.html

反復にさらに要素がある場合は true になります。しかし、より多くの要素も最初の要素を意味する可能性がありますか?

[編集]

イテレータが反復する要素を正確に 2 つ持っているかどうかを知るにはどうすればよいですか? もちろん、繰り返してカウントすることはできますが、前に戻ったり、2 回繰り返したり、私の場合はイテレーターを複製したりすることはできません。これは Hadoop イテレーターです。

4

8 に答える 8

5

それは最初のものを意味することができます。ゼロ以上の要素があることだけを確認できます

于 2012-06-27T12:40:34.387 に答える
3

hasNext() が true または false を返すと、ゼロ項目と 1 つ以上の項目 (反復の開始時) を区別できるようになります。

反復を開始せずに、2 つ以上あるかどうかを知りたい。基本的にはできないと思います。その情報を公開することは、イテレーターがしなければならないことではありません。次のアイテム (およびこのアイテムが存在するかどうかに関する情報) のみを使用可能にします。

おそらく、反復子自体はまだその知識を持っていません!

もちろん、すでにリストから取り出したアイテムを自由に覚えることができます。リストに実際に 2 つ以上のアイテムがあることがわかったら、後でそれらを使用できます。

反復子を他のコードに渡す必要がある場合は、反復子を実装する独自のクラスを作成し、最初の 2 つの項目をメンバー変数として内部的に記憶し、それらを最初に渡し、元の反復子の残りの項目を反復処理し続けることができます。 (それ以上残っている場合)-元のイテレータへの参照もカスタムメイドのイテレータに保存する必要があります

于 2012-06-27T13:03:47.113 に答える
2

Java イテレータは、最初の要素の前に配置されます。あなたの式myIterable.iterator().hasNext()が示しているのは、少なくとも 1 つの要素があるということです。

于 2012-06-27T12:41:29.207 に答える
1

myIterable.iterator().hasNext()が返された場合trueは、少なくとも1つの要素があり、それにnext()アクセスするために使用できることを意味します。

于 2012-06-27T12:46:00.543 に答える
1

いいえ。hasNext() が true を返す場合、反復子の起点位置は最初の要素の前にある必要があるため、コレクションに少なくとも 1 つの要素があることを意味します。

List l = new ArrayList();
l.add(1);
Iterator it = l.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}

iterator の起点位置は最初の要素の前でなければならないため、結果は1になります。it.hasNext()初めてチェックすると、要素が 1 つあるためtrueが返されます。次に、it.next() を使用して要素を出力します。今だけ、最初の位置の反復子。it.hasNext()2 回目にチェックすると、 falseが返されます。

于 2012-06-27T12:51:08.407 に答える
1

イテレータが反復する要素を正確に 2 つ持っているかどうかを知るにはどうすればよいですか? もちろん、反復してカウントすることはできますが、私の場合、前に戻ったり、2 回反復したり、反復子を複製したりすることはできません。これは Hadoop 反復可能です。

これを行う方法はありません。たぶん、あなたのシナリオではイテレータが間違っています。

于 2012-06-27T12:58:05.227 に答える
1

hasNextでアクセスできる別の要素があることを示しますnext()。したがって、少なくとも 1 つの要素があることを意味します。

于 2012-06-27T12:41:27.540 に答える
0

イテレータには、cursor という名前のフィールドがあります。このカーソルの初期値は、コレクション オブジェクトのサイズです。メソッド next() を呼び出すと、次のようになります。メソッド hasNext() は、カーソルがゼロに等しいことを確認します。そのゼロは false を返し、そうでない場合は true を返します。

しかし、リストとマップは同じではありません。それらの違いは具体的な実現であり、オリジナルは同じです。リスト チェック サイズ、マップ チェック エンド ノード。

于 2012-06-27T13:21:00.383 に答える