Как получить текущий индекс цикла при использовании Iterator? - PullRequest
88 голосов
/ 25 июля 2010

Я использую итератор для перебора коллекции и я хочу получить индекс текущего элемента.

Как я могу это сделать?

Ответы [ 11 ]

92 голосов
/ 17 декабря 2011

У меня был тот же вопрос, и я обнаружил, что использование 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());
}

Убедитесь, что вы вызываете nextIndex ДО того, как вы действительно получите next ().

83 голосов
/ 25 июля 2010

Используйте свою собственную переменную и увеличивайте ее в цикле.

27 голосов
/ 30 сентября 2011

Вот способ сделать это, используя собственную переменную и сделать ее краткой:

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 # следующий раз за цикл - просто сделайте это сверху).

20 голосов
/ 20 августа 2012

Вы можете использовать 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);
}
10 голосов
/ 25 июля 2010

Что за коллекция? Если это реализация интерфейса List, то вы можете просто использовать it.nextIndex() - 1.

4 голосов
/ 26 июля 2010

Используйте ListIterator для перебора коллекции. Если коллекция не является списком, для начала используйте Arrays.asList(Collection.toArray()), чтобы сначала превратить ее в список.

2 голосов
/ 21 декабря 2013

просто сделайте что-то вроде этого:

        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 голосов
/ 25 июля 2010

Используйте int и увеличивайте его в вашем цикле.

1 голос
/ 28 апреля 2011

См. здесь .

iterator.nextIndex() предоставит индекс элемента, который будет возвращен последующим вызовом next().

0 голосов
/ 13 июля 2018

Хотя у вас уже был ответ, подумал добавить немного информации.

Как вы явно упомянули Коллекции, вы не можете использовать 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() с непрерывным приращением значения, чтобы получить текущий индекс для любого типа коллекции.

...