En este momento, tengo un programa que contiene un fragmento de código que se ve así:
while (arrayList.iterator().hasNext()) {
     //value is equal to a String value
     if( arrayList.iterator().next().equals(value)) {
          // do something 
     }
}
¿Lo estoy haciendo bien, en lo que respecta a la iteración a través de ArrayList?
El error que recibo es:
java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.ArrayList.get(Unknown Source)
    at main1.endElement(main1.java:244)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(Unknown Source)
    at main1.traverse(main1.java:73)
    at main1.traverse(main1.java:102)
    at main1.traverse(main1.java:102)
    at main1.main(main1.java:404)
Mostraría el resto del código, pero es bastante extenso, y si no estoy haciendo la iteración correctamente, asumiría que la única posibilidad es que no estoy inicializando ArrayListcorrectamente.
                    
                        java
                                arraylist
                                iterator
                                indexoutofboundsexception
                                
                    
                    
                        Este programador
fuente
                
                fuente

forEachmétodo: stackoverflow.com/questions/16635398/…Respuestas:
No: al llamar
iteratordos veces en cada iteración, obtiene nuevos iteradores todo el tiempo.La forma más sencilla de escribir este bucle es usar la construcción for-each :
Como para
Intentaste obtener el número de elemento
-1de una matriz. El conteo comienza en cero.fuente
do array.each |s| unless (s.nil?) end endHave you heard ofparece un poco ofensivo (sin ninguna razón), pero no soy nativo. Por lo demás genial.Si bien estoy de acuerdo en que la respuesta aceptada suele ser la mejor solución y definitivamente más fácil de usar, noté que nadie mostró el uso adecuado del iterador. Así que aquí hay un ejemplo rápido:
fuente
o
Pero tenga cuidado, ArrayList puede contener valores nulos . Entonces la comparación debería ser
cuando esté seguro de que el valor no es nulo o debe verificar si el elemento dado es nulo.
fuente
También puedes usar así:
Es una buena práctica lanzar y usar el objeto. Por ejemplo, si 'arrayList' contiene una lista de objetos 'Object1'. Luego, podemos reescribir el código como:
fuente
También puede hacer un bucle for como lo haría con una matriz, pero en lugar de la matriz [i], usaría list.get (i)
fuente
Aparte de la respuesta de larsman (que de hecho es correcta), la excepción en una llamada a un método get (), por lo que el código que ha publicado no es el que está causando el error.
fuente
Manera eficiente de iterar su
ArrayListseguido por este enlace . Este tipo mejorará el rendimiento del bucle durante la iteración.fuente
iterar usando el iterador no es a prueba de fallas, por ejemplo, si agrega un elemento a la colección después de la creación del iterador, arrojará una excepción de modificación simultánea. Además, no es seguro para subprocesos, tienes que hacer que sea seguro para subprocesos externamente.
Por lo tanto, es mejor usar la estructura for-each de for loop. Es al menos a prueba de fallas.
fuente