카테고리 보관물: Java

Java

ArrayList의 반복자를 사용할 때 ArrayIndexOutOfBoundsException 발생 is equal

지금은 다음과 같은 코드가 포함 된 프로그램이 있습니다.

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));
}