102

現在、次のようなコードを含むプログラムがあります。

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適切に初期化していないことだと思います。

4

8 に答える 8

230

Arraylist を反復処理する限り、私はそれを正しく行っていますか?

いいえ:iterator各イテレーションで 2 回呼び出すことで、常に新しいイテレータを取得しています。

このループを記述する最も簡単な方法は、for-eachコンストラクトを使用することです。

for (String s : arrayList)
    if (s.equals(value))
        // ...

はどうかと言うと

java.lang.ArrayIndexOutOfBoundsException: -1

配列から要素番号を取得しようとしまし-1た。カウントはゼロから始まります。

于 2011-07-14T22:31:38.437 に答える
142

受け入れられた回答が通常は最良の解決策であり、間違いなく使いやすいことに同意しますが、イテレータの適切な使用法を誰も表示していないことに気付きました。簡単な例を次に示します。

Iterator<Object> it = arrayList.iterator();
while(it.hasNext())
{
    Object obj = it.next();
    //Do something with obj
}
于 2012-09-19T18:29:19.227 に答える
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 は null 値を保持できることに注意してください。したがって、比較は

value.equals(arrayList.get(i))

値がnullでないことが確実な場合、または指定された要素がnullかどうかを確認する必要がある場合。

于 2011-07-14T22:34:09.503 に答える
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
}
于 2013-04-15T15:03:34.183 に答える
8

配列の場合と同じように for ループを実行することもできますが、array[i] の代わりに list.get(i) を使用します。

for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}
于 2011-07-14T22:36:32.333 に答える
7

larsmans の回答 (確かに正しい人) とは別に、get() メソッドの呼び出しの例外であるため、投稿したコードはエラーの原因ではありません。

于 2011-07-14T22:35:35.063 に答える
4

このリンクArrayListをたどって反復する効率的な方法。このタイプは、反復中のループのパフォーマンスを向上させます

int size = list.size();

for(int j = 0; j < size; j++) {
    System.out.println(list.get(i));
}
于 2014-01-08T13:38:20.380 に答える
2

イテレータを使用した反復はフェイルセーフではありません。たとえば、イテレータの作成後に要素をコレクションに追加すると、concurrentmodificaionexception がスローされます。また、スレッドセーフではありません。外部でスレッドセーフにする必要があります。

そのため、for ループの for-each 構造を使用することをお勧めします。少なくともフェイルセーフです。

于 2014-08-16T11:31:34.120 に答える