2017-09-08 5 views
-3

これを書いて、ArrayListからすべての偶数を削除しましたが、予期しなかったことにオッズを削除しています。Forループ内のイテレータは、オッズが消えないようにします

コード:ところで

ArrayList arr = new ArrayList<Integer>(); //filled 1-1000 

protected void eliminateEven() 
    { 
     x = 0; 
     for(Iterator<String> iter = arr.iterator(); iter.hasNext();) 
     { 
      iter.next(); 

      if(x % 2 == 0) 
      { 
       iter.remove(); 
      } 
      x++; 
     } 

     System.out.println(arr); 
    } 

、「ARRは、」私はこれでいくつかの助けをいただければ幸いですので、私は私が間違っていたかを把握することができます1000にあらかじめ入力ArrayListのです。

+1

偶数の値を持つアイテムではなく、偶数のインデックスを持つアイテムをリストから削除します。その値に基づいて物を削除したい場合は、ループカウンタをチェックするだけでなく、その値が何であるかをチェックする必要があります。 – azurefrog

+0

は 'arr'の定義とその記入方法;)インデックスを削除しますか?なぜなら、奇妙な要素は、文字列の場合には不可能だと思われるからです。 – azro

+0

私は謝罪します。定義を追加... –

答えて

1

Integerのリストと、Stringのイテレータがあるようです。それは意味をなさない。しかし、それらが文字列であると仮定すると、それらが偶数であるかどうかをチェックする前に、整数に変換する必要があります。

あなたはxインデックスを維持する必要はありません、余談として私を

arr.removeIf(i -> Integer.valueOf(i) % 2 == 0); 

:Javaの8中

if (Integer.valueOf(iter.next()) % 2 == 0) 
    iter.remove(); 

あるいは、さらに簡単:ちょうどイテレータの値をチェックwhileループは、next句を持たないforループよりも少しはっきりしていると示唆します。

+0

おかげさまで@azurefrog – sprinter

1

あなたはスキーです実際に状態をチェックする前に

iter.next() 

を呼び出すことにより、最初の項目をpping、その後、あなたのイテレータはそれもあなたが望むようにするのではなく、奇数の要素を削除している理由です、先にあなたの「インデックス」よりも実際には1つの立場」でありますに。それはこのようになりますシンプルなアウターループ付き

0

:もちろん

Iterator<String> iter = arr.iterator(); 
int x = 1; 
while (iter.hasNext()) { 
    iter.next(); 
    if(x % 2 == 0) { 
     iter.remove(); 
    } 
    x++; 
} 

、より優雅な解決策が存在します。

関連する問題