지금은 다음과 같은 코드가 포함 된 프로그램이 있습니다.
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
제대로 초기화하지 않는 것이 유일한 가능성이라고 생각합니다 .
답변
Arraylist를 반복하는 한 내가 올바르게하고 있습니까?
아니오 : iterator
각 반복에서 두 번 호출 하면 항상 새 반복자를 얻습니다.
이 루프를 작성하는 가장 쉬운 방법은 for-each 구문을 사용하는 것 입니다 .
for (String s : arrayList)
if (s.equals(value))
// ...
에 관해서
java.lang.ArrayIndexOutOfBoundsException: -1
방금 -1
배열에서 요소 번호를 얻으려고했습니다 . 계산은 0에서 시작됩니다.
답변
허용되는 답변이 일반적으로 최상의 솔루션이고 확실히 사용하기 쉽다는 데 동의하지만 아무도 반복자의 적절한 사용법을 표시하지 않았습니다. 여기에 간단한 예가 있습니다.
Iterator<Object> it = arrayList.iterator();
while(it.hasNext())
{
Object obj = it.next();
//Do something with obj
}
답변
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는 null 값을 보유 할 수 있습니다 . 따라서 비교는
value.equals(arrayList.get(i))
값이 null이 아니라고 확신하거나 주어진 요소가 null인지 확인해야합니다.
답변
다음과 같이 사용할 수도 있습니다.
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
}
답변
배열에 대해하는 것처럼 for 루프를 수행 할 수도 있지만 array [i] 대신 list.get (i)를 사용합니다.
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
답변
larsmans 답변 (실제로 올바른 사람) 외에도 get () 메서드 호출의 예외이므로 게시 한 코드가 오류를 일으키는 코드가 아닙니다.
답변
ArrayList
이 링크를 따라가는 효율적인 방법 . 이 유형은 반복 중 루핑 성능을 향상시킵니다.
int size = list.size();
for(int j = 0; j < size; j++) {
System.out.println(list.get(i));
}