Pregunta

Cuando invierto iterar sobre un ArrayList que estoy recibiendo un IndexOutOfBoundsException. He intentado hacer hacia adelante iteración y no hay ningún problema. Espero y sé que hay cinco elementos en la lista. El código es el siguiente:

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));
}

Reenviar iteración - que está trabajando muy bien, pero no es útil para mí:

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

El error:

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)

Además, si alguien sabe de un mejor lenguaje para la iteración inversa estaría feliz de probar que fuera.

¿Fue útil?

Solución

Iniciar la iteración en list.size() - 1 porque la matriz (o ArrayList) elementos se numeran de 0 a través de 1 menor que el tamaño de la lista. Este es un lenguaje bastante estándar:

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

Tenga en cuenta que sus trabajos de iteración hacia adelante porque se detiene antes alcanzando list.size().

Otros consejos

Evitar índices en total? ¿Qué hay de:

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

Sé que esto es una cuestión de edad, sino de Java contiene un método Collections.reverse( List<T> ). ¿Por qué no simplemente invertir y hacerlo hacia adelante iteración?

La forma más elegante es invertir la matriz y luego usar un iterador directa (o incluso implícita):

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

El list.size () es pasado el último índice permisible.

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

Los arrays de Java se indexan-cero. Usted tendrá que establecer j = list.size () -. 1 y continuar hasta j = 0

Si las listas son bastante pequeño, por lo que el rendimiento no es un problema real, se puede utilizar el reverse-metod de la clase Lists en Google Guava. Los rendimientos bastante for-each de código, y la lista original sigue siendo el mismo. Además, la lista revertido con el respaldo de la lista original, por lo que cualquier cambio en la lista original se refleja en el más invertido.

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);

produce el siguiente resultado:

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

Lo que significa que la iteración inversa de miLista se puede escribir como:

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

Puede invertir en una línea que es

Collections.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);

Salida

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

Puede hacer esto si se siente cómodo con el bucle foreach.

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top