Iteratorを使用してコレクションを反復処理しており、現在の要素のインデックスを取得したい。
どうやってやるの?
独自の変数を使用して、ループ内でそれをインクリメントします。
私は同じ質問を持っていて、ListIteratorを使用するとうまくいきました。上記のテストと同様:
List<String> list = Arrays.asList("zero", "one", "two");
ListIterator iter = list.listIterator();
while (iter.hasNext()) {
System.out.println("index: " + iter.nextIndex() + " value: " + iter.next());
}
実際にnext()を取得する前に、nextIndexを呼び出してください。
独自の変数を使用して簡潔にする方法は次のとおりです。
List<String> list = Arrays.asList("zero", "one", "two");
int i = 0;
for (Iterator<String> it = list.iterator(); it.hasNext(); i++) {
String s = it.next();
System.out.println(i + ": " + s);
}
出力(推測した):
0: zero
1: one
2: two
利点は、ループ内でインデックスをインクリメントしないことです(ただし、ループごとにIterator#nextを1回だけ呼び出すように注意する必要がありますが、先頭で行うだけです)。
ListIterator
を使用して、カウントを実行できます。
final List<String> list = Arrays.asList("zero", "one", "two", "three");
for (final ListIterator<String> it = list.listIterator(); it.hasNext();) {
final String s = it.next();
System.out.println(it.previousIndex() + ": " + s);
}
どのようなコレクションですか? Listインターフェースの実装であれば、it.nextIndex() - 1
を使用できます。
ListIterator を使用して、コレクションを反復処理します。コレクションが開始リストではない場合、Arrays.asList(Collection.toArray())
を使用して最初にリストに変換します。
Intを使用して、ループ内でインクリメントします。
このようなことをしてください:
ListIterator<String> it = list1.listIterator();
int index = -1;
while (it.hasNext()) {
index++;
String value = it.next();
//At this point the index can be checked for the current element.
}
here を参照してください。
iterator.nextIndex()
は、next()
への後続の呼び出しによって返される要素のインデックスを提供します。
必要なのは、iterator.nextIndex()を使用して、イテレータが存在する現在のインデックスを返すことです。これは、独自のカウンター変数を使用するよりも少し簡単かもしれません(これも動作します)。
public static void main(String[] args) {
String[] str1 = {"list item 1", "list item 2", "list item 3", "list item 4"};
List<String> list1 = new ArrayList<String>(Arrays.asList(str1));
ListIterator<String> it = list1.listIterator();
int x = 0;
//The iterator.nextIndex() will return the index for you.
while(it.hasNext()){
int i = it.nextIndex();
System.out.println(it.next() + " is at index" + i);
}
}
このコードは、list1リストを一度に1項目ずつ調べて項目のテキストを出力し、「インデックスにある」場合、反復子が見つけたインデックスを出力します。 :)
すでに答えはありましたが、情報を追加することを検討してください。
コレクションを明示的に述べたように、listIterator
を使用して、すべてのタイプのコレクションのインデックスを取得することはできません。
リストインターフェイス-ArrayList、LinkedList、Vector、およびStack。
iterator()
とlistIterator()
の両方があります
インターフェイスの設定-HashSet、LinkedHashSet、TreeSet、およびEnumSet。
iterator()
のみがあります
マップインターフェイス-HashMap、LinkedHashMap、TreeMap、IdentityHashMap
イテレータはありませんが、keySet()
/values()
またはentrySet()
を使用して、keySet()
およびentrySet()
がSet
を返し、values()
がCollection
を返します。
そのため、値の連続的な増分でiterators()
を使用して、任意のコレクションタイプの現在のインデックスを取得することをお勧めします。