Я використовую ітератор, щоб повторити колекцію і хочу отримати індекс поточного елемента.
Як я можу це зробити?
Я використовую ітератор, щоб повторити колекцію і хочу отримати індекс поточного елемента.
Як я можу це зробити?
Відповіді:
Використовуйте власну змінну та збільшуйте її у циклі.
it.nextIndex()
. Корисно, коли колекція - Список.
У мене було те саме питання, і я виявив, що за допомогою 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());
}
Переконайтесь, що ви зателефонували до наступного ІНДЕКСУ ПЕРЕД, коли ви дійсно отримаєте наступний ().
Ось спосіб це зробити за допомогою власної змінної та зберігаючи її стисло:
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 один раз за цикл - просто зробіть це вгорі).
asList("zero", "one", "two")
Ви можете використовувати 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())
щоб спочатку перетворити його на список.
просто зробіть щось подібне:
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.
}
Використовуйте int та збільшуйте його у своєму циклі.
Дивіться тут .
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, перераховуючи по одному предмету за раз та друкуючи текст елемента, потім "знаходиться в індексі", тоді він буде друкувати індекс, у якому його знайшов ітератор. :)
Хоча ви вже мали відповідь, подумали додати трохи інформації.
Як ви прямо згадували про колекції, ви не можете використовувати 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()
з постійним збільшенням значення, щоб отримати поточний індекс для будь-якого типу колекції.