Pergunta

Quando reverter o itero sobre uma lista de Array, estou recebendo uma parte de base de BBOUNDSEXCECTION. Tentei fazer iteração avançada e não há problema. Espero e sei que existem cinco elementos na lista. O código está abaixo:

Collection rtns = absRtnMap.values();
List list = new ArrayList(rtns);
Collections.sort(list);

for(int j=list.size();j>0;j=j-1){
  System.out.println(list.get(j));
}

A iteração avançada - que está funcionando bem, mas não é útil para mim:

for(int j=0;j<list.size();j++){
    System.out.println(list.isEmpty());
    System.out.println(list.get(j));
} // this worked fine

O erro:

Exception in thread "Timer-0" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
    at java.util.ArrayList.RangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at model.Return.getReturnMap(Return.java:61)
    at controller.Poller$1.run(Poller.java:29)
    at java.util.TimerThread.mainLoop(Unknown Source)
    at java.util.TimerThread.run(Unknown Source)

Além disso, se alguém souber de um idioma melhor para iteração reversa, ficaria feliz em experimentar isso.

Foi útil?

Solução

Iniciar a iteração em list.size() - 1 Porque a matriz (ou ArrayList) Os elementos são numerados de 0 a 1 a menos que o tamanho da lista. Este é um idioma bastante padrão:

for (int j = list.size() - 1; j >= 0; j--) {
    // whatever
}

Observe que sua iteração avançada funciona porque para antes da chegando list.size().

Outras dicas

Evitar os índices completamente? Que tal:

for (ListIterator iterator = list.listIterator(list.size()); iterator.hasPrevious();) {
  final Object listElement = iterator.previous();
}

Eu sei que essa é uma pergunta antiga, mas Java contém um Collections.reverse( List<T> ) método. Por que você não apenas reverteria e faria a iteração avançada?

A maneira mais elegante é reverter a matriz e depois usar um iterador direto (ou até implícito):

Collections.reverse(arrayList);
for (Object item : arrayList) {
    ...
}

O list.size () passou do último índice permitido.

for(int j = list.size() - 1; j >= 0; j--) {
  System.out.println(list.get(j));
}

As matrizes Java são indexadas zero. Você precisará definir j = list.size () - 1 e continuar até J = 0.

Se as listas são bastante pequenas para que o desempenho não seja um problema real, pode -se usar o reverse-Metod do Lists-Class in Google Guava. Produz bonito for-each-Code, e a lista original permanece a mesma. Além disso, a lista invertida é apoiada pela lista original; portanto, qualquer alteração na lista original será refletida no revertido.

import com.google.common.collect.Lists;

[...]

final List<String> myList = Lists.newArrayList("one", "two", "three");
final List<String> myReverseList = Lists.reverse(myList);

System.out.println(myList);
System.out.println(myReverseList);

myList.add("four");

System.out.println(myList);
System.out.println(myReverseList);

Produz o seguinte resultado:

[one, two, three]
[three, two, one]
[one, two, three, four]
[four, three, two, one]

O que significa que a iteração reversa da MyList pode ser escrita como:

for (final String someString : Lists.reverse(myList) {
    //do something
}

Você pode reverter em uma linha que é

Coleções.Reverse (lista);

ArrayList arrayList = new ArrayList();

arrayList.add("A");
arrayList.add("B");

System.out.println("Before Reverse Order : " + arrayList);

Collections.reverse(arrayList);

System.out.println("After Reverse : " + arrayList);

Resultado

Before Reverse Order : [A, B]
After Reverse : [B, A]

Você pode fazer isso se estiver confortável com o FOREach Loop.

List<String> list = new ArrayList<String>();
list.add("ABC");
list.add("DEF");
list.add("GHI");

ListIterator<String> listIterator = list.listIterator(list.size());

while(listIterator.hasPrevious()){
  System.out.println(listIterator.previous());
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top