Estou usando um Iterador para iterar por meio de uma coleção e desejo obter o índice do elemento atual.
Como eu posso fazer isso?
Estou usando um Iterador para iterar por meio de uma coleção e desejo obter o índice do elemento atual.
Como eu posso fazer isso?
Respostas:
Use sua própria variável e a incremente no loop.
it.nextIndex()
. Útil quando a coleção é uma Lista.
Eu tive a mesma dúvida e descobri que usar um ListIterator funcionou. Semelhante ao teste acima:
List<String> list = Arrays.asList("zero", "one", "two");
ListIterator iter = list.listIterator();
while (iter.hasNext()) {
System.out.println("index: " + iter.nextIndex() + " value: " + iter.next());
}
Certifique-se de chamar o nextIndex ANTES de realmente obter o next ().
Esta é uma maneira de fazer isso usando sua própria variável e mantendo-a concisa:
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);
}
Resultado (você adivinhou):
0: zero
1: one
2: two
A vantagem é que você não incrementa seu índice dentro do loop (embora você precise ter cuidado para chamar Iterator # next apenas uma vez por loop - apenas faça isso no topo).
asList("zero", "one", "two")
Você pode usar ListIterator
para fazer a contagem:
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);
}
Que tipo de coleção? Se for uma implementação da interface List, você pode simplesmente usar it.nextIndex() - 1
.
Use um ListIterator para iterar pela coleção. Se a coleção não for uma lista para começar, use primeiro Arrays.asList(Collection.toArray())
para transformá-la em uma lista.
apenas faça algo assim:
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.
}
Use um int e incremente-o dentro do seu loop.
Veja aqui .
iterator.nextIndex()
forneceria o índice do elemento que seria retornado pela chamada subsequente para next()
.
Tudo o que você precisa é usar iterator.nextIndex () para retornar o índice atual em que o iterador está. Isso pode ser um pouco mais fácil do que usar sua própria variável de contador (que ainda funciona também).
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);
}
}
Este código irá percorrer a lista list1 um item de cada vez e imprimir o texto do item, então "está no índice" então ele irá imprimir o índice em que o iterador o encontrou. :)
Embora você já tenha a resposta, pensei em adicionar algumas informações.
Como você mencionou Coleções explicitamente, você não pode usar listIterator
para obter o índice para todos os tipos de coleções.
Interfaces de lista - ArrayList, LinkedList, Vector e Stack.
Tem ambos iterator()
elistIterator()
Definir interfaces - HashSet, LinkedHashSet, TreeSet e EnumSet.
Tem apenas iterator()
Interfaces de mapa - HashMap, LinkedHashMap, TreeMap e IdentityHashMap
Não tem iteradores, mas pode ser iterado usando keySet()
/ values()
ou entrySet()
como keySet()
e entrySet()
retorna Set
e values()
retornaCollection
.
Portanto, é melhor usar iterators()
com incremento contínuo de um valor para obter o índice atual para qualquer tipo de coleção.