2011-01-11 5 views
2

私は何をしようとしていません私は私のリスト内のすべてのオブジェクトを削除するように見えることはできません。 私はいつもアイテムの半分を取り除きますが、残りの半分は何らかの理由で残っています。リスト内のオブジェクトの束を取り除く方法

非常に感謝しています。

答えて

3

ループ中にリストを変更しているため、すべての2番目のアイテムが削除されます。つまり、0番目の要素を削除します。その場合、1番目の要素が置き換えられ、新しい1番目の要素などに移動します。 デバッガを使用した場合は、これが発生します。

最も簡単なことは、要素を前後に移動させないので、逆の順序で要素を削除することです。

for(int i=listCon.size()-1; i>=0; i--) 
    removeConnection(listCon.get(i)); 
+0

typo?私は++をi - –

+0

に変更しました。++を '--'に変更する自由を取った –

+0

@Bart、@ありがとうございます。 –

7

繰り返し処理中にリストからオブジェクトを削除する古典的な問題です。

for(int i=0; i < listCon.size(); i++) 
{ 
    removeConnection(listCon.get(i)); 
} 

あなた

  • 削除対象0オブジェクト1が今あることに使用されるどのような
  • オブジェクト0、オブジェクト2が今である(1
  • 削除オブジェクト1オブジェクトにするために使用するもの
  • 以前はオブジェクト2であったものがオブジェクト1、オブジェクト3であったものがオブジェクト2になりました。

これに対する多くの解決策。 1つの一般的な方法は、サイズが0になるまで要素0を削除することです。

EDIT:実際には他の操作なしで配列をクリアするだけの目的ならば、listCon.clear()がはるかに良いアプローチです。私は、removeConnectionが要素をリストから削除するだけではなく、あなたの例を単純にすることを示していないことを前提にしています。

+0

または 'clear()'を使うか、 'List.size() - 1'から削除を始め、' i'を減らすか、 'List'を再初期化してください:' listCon = new ArrayList (); '問題の明確な説明は+1。 –

+0

'removeConnection()'間接指定は、 'removeConnection'がリストから要素を削除するよりも多くのクリーンアップ作業を実行するので、私はそれを追加しようとしていました。そうでない場合は、明らかにclear()が望ましい解決策です。私はおそらくそれを追加する必要があります。 – EboMike

+0

私はオブジェクトが削除される直前にothermethodを呼び出さなければならなかったので、私はピーターズの答えを好むが、解決策をありがとう。よろしくお願いします。 – JeffBr

2

ループ構造で配列構造を変更していますが、これは実際に経験したとおりの悪い考えです。要素を削除すると配列要素が移動するため、要素をスキップします。

while(listCon.size() > 0){ 
    listCont.remove(0); 
} 

+0

次回、ウィル、次回はまだアップヴォートの価値があります。 – EboMike

2

何のリストは、()メソッドを使用して.clearについては、それを私にビート@ebomike:

これを行うための最善の方法

は、whileループを使用していますか?

繰り返し実行中に段階的に削除する必要がある場合は、リストイテレータとremove()メソッドを使用する必要があります。

+0

私の削除メソッドで特定の接続を指定できるようにしたい。一度に一掃するわけではありません。 – JeffBr

+0

私はそれを取得しません。 removeメソッドは正しく動作します。クライアントから呼び出された場合は、要求された接続オブジェクトがリストから削除されます。とにかく、あなたのinactivateメソッドはすべての接続を削除するためのものです。この場合、.clear()は十分であるようです。 – Thomas

5

あなたはこの方法でリストからオブジェクトを削除した後に「私は」によって参照されているものに変化している:

Iterator it = listCon.iterator(); 
while(it.hasNext()) 
{ 
    it.remove(); 
} 

かで:

public void inActivate() 
{ 
    for(int i=0; i < listCon.size(); i++) 
    { 
     removeConnection(listCon.get(i)); 
    } 
} 

をする代わりに、イテレータを使用この場合は、リストをクリアしてください:

listCon.clear(); 
1

なぜ使用しないのですか?listCon.clear()for(int i = listCon.size -1; i >=0; i--) { listCon.remove(i); }

やウィルKRUなど

は、常に、

最後に0番目の要素を削除するイテレータを使用することを示唆してiterator.remove:それに失敗

、あなたのループを逆に for(Iterator<Connection> i = listCon.iterator(); i.hasNext();) { Connection c = i.next(); i.remove(); }

関連する問題