No momento, tenho um programa que contém um trecho de código semelhante a este:
while (arrayList.iterator().hasNext()) {
//value is equal to a String value
if( arrayList.iterator().next().equals(value)) {
// do something
}
}
Estou fazendo isso certo, no que diz respeito à iteração por meio da ArrayList?
O erro que estou recebendo é:
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)
Eu mostraria o resto do código, mas é bastante extenso e, se não estou fazendo a iteração corretamente, presumo que a única possibilidade é não estar inicializando ArrayList
corretamente.
java
arraylist
iterator
indexoutofboundsexception
Este 0ne Pr0grammer
fonte
fonte
forEach
método: stackoverflow.com/questions/16635398/…Respostas:
Não: chamando
iterator
duas vezes em cada iteração, você obtém novos iteradores o tempo todo.A maneira mais fácil de escrever esse loop é usando a construção for-each :
Quanto a
Você acabou de tentar obter o número
-1
do elemento de uma matriz. A contagem começa em zero.fonte
do array.each |s| unless (s.nil?) end end
Have you heard of
parece meio ofensivo (sem motivo), mas não sou nativo. Caso contrário, ótimo.Embora eu concorde que a resposta aceita geralmente é a melhor solução e definitivamente mais fácil de usar, percebi que ninguém exibiu o uso adequado do iterador. Então, aqui está um exemplo rápido:
fonte
ou
Mas tenha cuidado, ArrayList pode conter valores nulos . Portanto, a comparação deve ser
quando tiver certeza de que o valor não é nulo ou você deve verificar se determinado elemento é nulo.
fonte
Você também pode usar desta forma:
É uma boa prática lançar e usar o objeto. Por exemplo, se 'arrayList' contém uma lista de objetos 'Object1'. Então, podemos reescrever o código como:
fonte
Você também pode fazer um loop for como faria para um array, mas em vez de array [i], você usaria list.get (i)
fonte
Além da resposta de larsmans (que de fato está correta), a exceção em uma chamada para um método get (), então o código que você postou não é o que está causando o erro.
fonte
Maneira eficiente de iterar seu
ArrayList
seguido por este link . Este tipo irá melhorar o desempenho do loop durante a iteraçãofonte
iterar usando o iterador não é seguro contra falhas, por exemplo, se você adicionar um elemento à coleção após a criação do iterador, ele lançará concurrentmodificaionexception. Além disso, não é thread-safe, você deve torná-lo thread-safe externamente.
Portanto, é melhor usar for-each estrutura de loop for. É pelo menos à prova de falhas.
fonte