2016-04-26 5 views
-3

ArrayListコレクションの番号が0〜10であるかどうかを確認する必要があります。 Iteratorを使用して、私はその中のすべての偶数を印刷しなければならず、ArrayListから奇数を取り除く必要があります。add(Object o)、remove(Object o)などのコレクションメソッドが、削除または更新するイテレーション内で動作しないのはなぜですか?

package hemantdhanuka; 

import java.util.*; 

public class Iteratorr { 

    public static void main(String [] args) { 
     ArrayList v = new ArrayList(); 
     for(int i = 0; i <= 10; i++) { 
      v.add (i); 
     } 
     System.err.println (v); 
     Iterator i = v.iterator(); 
     /*while (i.hasNext()) { 
      Integer a = (Integer) i.next(); 
      if (i % 2 == 0) { 
       System.out.println (i); 
      } else { 
       i.remove(); 
      } 
     }  
     System.out.println (v); 
     */ 
     while(i.hasNext()) { 
      Integer a = (Integer) i.next(); 
      if (a % 2 == 0) { 
       System.out.println (a); 
      } else { 
       v.remove (a); 
      } 
     } 
     System.out.println (v); 
    } 
} 

私が知っているが、コードが非についてコードコメント何正常に動作しますが、コメント?奇数をArrayListから削除するためにArrayList#remove(Obj o)を使用しようとすると、機能しません。 WHY

+0

「動作していません」は有効な問題文ではありません。これは何かを意味するかもしれません。コンパイルしませんか?ランタイム例外?予期しない動作?できるだけ具体的にする。 – tnw

+0

'Iterator'については、ドキュメントをよく読んでください。'このイテレータによって返された最後の要素を基になるコレクションから削除します(オプションの操作)。このメソッドは、next()の呼び出しごとに1回だけ呼び出すことができます。このメソッドを呼び出す以外の方法で反復処理が進行している間に、基礎となるコレクションが変更された場合、反復子の動作は不明です。したがって、 'Iterator'を使うと、リスト上で' remove() 'を呼び出すのではなく、常に' Iterator'の 'remove()'メソッドを使います。これは不特定の動作を引き起こします。 –

答えて

-1

List.listIterator()をチェックしてください。 ListIteratorインターフェイスにはremove()メソッドがあります。

+0

あなたの答えはもっと詳しく述べる必要があります。これはコメントでなければなりません。 – tnw

0

イテレータの知識を超えた形でコンテナを変更しているため、動作しません。

ArrayListとします。それは "n"要素と、反復子(各 "n"要素を順番に返す)を返すメソッドを持っています。

:あなたは

class MyArrayListIterator<T> implements Iterator<T> { 
    private final ArrayList<T> list; 
    private int index; 

    MyArrayListIterator(ArrayList<T> lst) { 
     list = lst; 
     index = 0; 
    } 

    public boolean hasNext() { 
     return index < list.size(); 
    } 

    public T next() { 
     return list.get(index++); 
    } 

    public void remove() { 
     throw new UnsupportedOperationException(); 
    } 
} 

このイテレータを使用して、そして(反復子のremoveメソッドを使用していない)直接奇妙な項目を削除する14

、リストには10​​が含まれていると11、13 ...独自のイテレータを書くことができます

  • 10が返されます。インデックスが1に増加する
  • 11が返されます。インデックスは2に増加します。 11がリストから削除されます。
  • 14(リストは今、 "10、13、14" であるため、インデックス== 2の項目は14です!)返さ

お知らせイテレータは、イテレータの進歩ので、 "13" の上に "スキップ" されます各呼び出し、およびリストを縮小して項目をより低いインデックスに移動させました。 ArrayListが変更されたとき、リストは(たとえスレッドせずに、複数のイテレータが存在することができる)に変更のその上で動作し、すべてのイテレータを伝える必要があります適切に機能するためのイテレータについては

。または、イテレータ自体が変更を行う必要があります。

ArrayListは、アクティブな各イテレータへの参照を格納しないため、前者のオプションは使用できません。代わりに、ArrayListは単純な状態値を保持します。状態値は変更が加えられたときに変更されます。イテレータは状態の予期しない変更をチェックでき、見つかった場合はConcurrentModificationExceptionをスローして、コードがコレクション上で不適切に動作していることをプログラマに警告することができます。

上記の「チェックできる」と「投げられます」ということに注意してください。イテレータは必ずしもそうする必要はありません。プログラマーがバグの多いコードを避けるのを助けるのがベストエフォートチェックです。

+0

はい、iteratorインターフェースのドキュメントでnetbeansを使用している間、Iteratorインターフェースには3つのメソッドがあります.hasNext(---)、2.Next(----)3.remove()の3つのメソッドがあります。 ......ここではDefineのみが記述されています。どのようにIteratorインターフェイスの実装クラスを見ることができますか?netbeans ideのどこでどのように使用するのですか? –

+0

上記のIteratorは例です。反復中にリストの 'add'と' remove'メソッドを使うことはできません。各コレクションクラスには独自のイテレーター実装があり、置き換えることはできません。具体的な実装の詳細については、Javaコレクションのソースコードを参照してください(必要に応じて、デバッガを使用してコードにステップインします)。しかし、実際にはまだ残っています。反復処理中にコレクションを変更すると、既存の反復処理が無効になる可能性があります。反復処理中に要素を削除するには、イテレータのremoveメソッドを使用します。 – AJNeufeld

+0

[ArrayList source](http://www.docjar.com/html/api/java/util/ArrayList.java.html)の780行目を参照してください。 – AJNeufeld

0

最も単純な答えは、forループ自体の内部で偶数/奇数をチェックする条件を使用することです。イテレータを使用する必要はありません。

イテレータを使用する必要がある場合は、2つのArrayListsを作成し、条件が満たされていればそれを入力します。

関連する問題