现在,我有一个包含一段代码的程序,如下所示:
while (arrayList.iterator().hasNext()) {
//value is equal to a String value
if( arrayList.iterator().next().equals(value)) {
// do something
}
}
我是否正确,只要迭代ArrayList就可以了?
我得到的错误是:
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)
我会显示剩下的代码,但它非常广泛,如果我没有正确地进行迭代,我会假设唯一的可能性是我没有正确初始化ArrayList
。
答案 0 :(得分:228)
我是否这样做,只要反复通过Arraylist去了?
否:通过在每次迭代中调用iterator
两次,您将始终获得新的迭代器。
编写此循环的最简单方法是使用for-each构造:
for (String s : arrayList)
if (s.equals(value))
// ...
至于
java.lang.ArrayIndexOutOfBoundsException: -1
您刚尝试从数组中获取元素编号-1
。计数从零开始。
答案 1 :(得分:141)
虽然我同意接受的答案通常是最好的解决方案并且肯定更容易使用,但我注意到没有人显示迭代器的正确用法。所以这是一个简单的例子:
Iterator<Object> it = arrayList.iterator();
while(it.hasNext())
{
Object obj = it.next();
//Do something with obj
}
答案 2 :(得分:37)
List<String> arrayList = new ArrayList<String>();
for (String s : arrayList) {
if(s.equals(value)){
//do something
}
}
或
for (int i = 0; i < arrayList.size(); i++) {
if(arrayList.get(i).equals(value)){
//do something
}
}
但要小心 ArrayList可以保存空值。所以比较应该是
value.equals(arrayList.get(i))
当您确定该值不为null或者您应该检查给定元素是否为空。
答案 3 :(得分:10)
你也可以这样使用:
for(Iterator iterator = arrayList.iterator(); iterator.hasNext();) {
x = iterator.next();
//do some stuff
}
投射和使用对象是一种很好的做法。 例如,如果'arrayList'包含'Object1'对象的列表。然后,我们可以将代码重写为:
for(Iterator iterator = arrayList.iterator(); iterator.hasNext();) {
x = (Object1) iterator.next();
//do some stuff
}
答案 4 :(得分:8)
您也可以像对数组一样进行for循环,但不使用数组[i],而是使用list.get(i)
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
答案 5 :(得分:7)
除了larsmans回答(谁确实是正确的),调用get()方法时的异常,因此您发布的代码不是导致错误的代码。
答案 6 :(得分:4)
有效迭代ArrayList
后跟link的方式。此类型将提高迭代期间循环的性能
int size = list.size();
for(int j = 0; j < size; j++) {
System.out.println(list.get(i));
}
答案 7 :(得分:2)
使用迭代器进行迭代不是故障安全的,例如,如果在迭代器创建之后将元素添加到集合中,那么它将抛出concurrentmodificaionexception。此外,它不是线程安全的,你必须在外部使其线程安全。
所以最好使用for循环的每个结构。它至少是故障安全的。