web-dev-qa-db-ja.com

Iteratorを使用しているときに現在のループインデックスを取得する方法は?

Iteratorを使用してコレクションを反復処理しており、現在の要素のインデックスを取得したい。

どうやってやるの?

88
Mahmoud Saleh

独自の変数を使用して、ループ内でそれをインクリメントします。

83
Chris Diver

私は同じ質問を持っていて、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を呼び出してください。

95
Paul

独自の変数を使用して簡潔にする方法は次のとおりです。

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回だけ呼び出すように注意する必要がありますが、先頭で行うだけです)。

28
Tom Clift

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);
}
20
Robert Klemme

どのようなコレクションですか? Listインターフェースの実装であれば、it.nextIndex() - 1を使用できます。

10
Mateusz Dymczyk

ListIterator を使用して、コレクションを反復処理します。コレクションが開始リストではない場合、Arrays.asList(Collection.toArray())を使用して最初にリストに変換します。

4
Jatin

Intを使用して、ループ内でインクリメントします。

2
Florian Reischl

このようなことをしてください:

        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.

        }
2
Sunny

here を参照してください。

iterator.nextIndex()は、next()への後続の呼び出しによって返される要素のインデックスを提供します。

1
Jolly

必要なのは、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項目ずつ調べて項目のテキストを出力し、「インデックスにある」場合、反復子が見つけたインデックスを出力します。 :)

0
Ryan

すでに答えはありましたが、情報を追加することを検討してください。

コレクションを明示的に述べたように、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()を使用して、任意のコレクションタイプの現在のインデックスを取得することをお勧めします。

0
Vignesh Raja