Saat ini, saya memiliki program yang berisi potongan kode yang terlihat seperti ini:
while (arrayList.iterator().hasNext()) {
//value is equal to a String value
if( arrayList.iterator().next().equals(value)) {
// do something
}
}
Apakah saya melakukan itu dengan benar, sejauh iterasi melalui ArrayList berjalan?
Kesalahan yang saya dapatkan adalah:
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)
Saya akan menunjukkan sisa kode, tetapi itu cukup ekstensif, dan jika saya tidak melakukan iterasi dengan benar, saya akan berasumsi satu-satunya kemungkinan adalah bahwa saya tidak menginisialisasi dengan ArrayList
benar.
java
arraylist
iterator
indexoutofboundsexception
Programmer 0ne ini
sumber
sumber
forEach
metode: stackoverflow.com/questions/16635398/…Jawaban:
Tidak: dengan memanggil
iterator
dua kali di setiap iterasi, Anda mendapatkan iterator baru setiap saat.Cara termudah untuk menulis perulangan ini menggunakan konstruksi for-each :
Adapun
Anda baru saja mencoba mendapatkan nomor elemen
-1
dari sebuah array. Penghitungan dimulai dari nol.sumber
do array.each |s| unless (s.nil?) end end
Have you heard of
sepertinya agak menyinggung (tanpa alasan), tapi saya bukan penduduk asli. Jika tidak bagus.Meskipun saya setuju bahwa jawaban yang diterima biasanya merupakan solusi terbaik dan pasti lebih mudah digunakan, saya perhatikan tidak ada yang menunjukkan penggunaan iterator yang tepat. Jadi, inilah contoh singkatnya:
sumber
atau
Tapi hati-hati ArrayList bisa menampung nilai null . Jadi perbandingan seharusnya
ketika Anda yakin bahwa nilainya bukan null atau Anda harus memeriksa apakah elemen yang diberikan adalah null.
sumber
Anda juga bisa menggunakan seperti ini:
Ini praktik yang baik untuk melemparkan dan menggunakan objek. Misalnya, jika 'arrayList' berisi daftar objek 'Object1'. Kemudian, kita dapat menulis ulang kode tersebut sebagai:
sumber
Anda juga bisa melakukan perulangan for seperti yang Anda lakukan untuk larik tetapi alih-alih larik [i], Anda akan menggunakan list.get (i)
sumber
Terlepas dari jawaban larsman (yang memang benar), pengecualian dalam panggilan ke metode get (), jadi kode yang Anda posting bukanlah yang menyebabkan kesalahan.
sumber
Cara yang efisien untuk mengulang Anda
ArrayList
diikuti oleh tautan ini . Jenis ini akan meningkatkan kinerja perulangan selama iterasisumber
iterasi menggunakan iterator tidak aman untuk kegagalan misalnya jika Anda menambahkan elemen ke koleksi setelah pembuatan iterator maka itu akan memunculkan concurrentmodificaionexception. Juga tidak aman untuk benang, Anda harus membuatnya aman untuk benang secara eksternal.
Jadi lebih baik menggunakan untuk-setiap struktur for loop. Ini setidaknya aman dari kegagalan.
sumber