Я использую Iterator для перебора коллекции и хочу получить индекс текущего элемента.
Как я могу это сделать?
Я использую Iterator для перебора коллекции и хочу получить индекс текущего элемента.
Как я могу это сделать?
Ответы:
Используйте свою собственную переменную и увеличивайте ее в цикле.
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());
}
Убедитесь, что вы вызываете nextIndex ДО того, как действительно получите 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()as keySet()и entrySet()возвращает Setи values()возвращаетCollection .
Поэтому лучше использовать iterators()с непрерывным приращением значения, чтобы получить текущий индекс для любого типа коллекции.