2012-02-16 13 views
4

私はarraylistに1000要素を追加し、それらをリストから系統的に(インデックスを指定することによって)削除してみようとしました。この背後にある考え方は、LinkedListのパフォーマンスをArrayListと比較することです。ルーピングとarraylistと指定されたインデックスで要素を削除する

int totalObjects = 0; 
    for(int i = 0; i < 1000; i++) 
    { 
     totalObjects += 1; 
     al.add("Object " + totalObjects); 

    } 
    System.out.println("The Arraylist size is " + al.size()); 

私が次のことをすると、要素の半分だけが削除されます...なぜですか?

for(int index = 0; index < al.size(); index++) 
    { 

     al.remove(index); 

    } 
    System.out.println("The Arraylist size after removal is " + al.size()); 

種類は アリウス

答えて

11

あなたが変更されているので、これが起こります削除してインデックスを作成します。要素0を削除すると、要素1は要素0になります。次に1を削除すると、以前は要素2になっていて、要素1はインデックス0に残ります。

これを避ける最も簡単な方法は次のとおりです。最後から最後まで逆方向にループします。

代わりに、ArrayListが空になるまでインデックス0を削除し続けることができます。

+0

私は理解しています...ありがとう – Arianule

8

は、あなたは、単にclear()メソッドを使用して、一度にすべての要素を削除することがあるので注意してくださいみなします。あなたのコードでは、問題は、リストを反復処理すると同時にリストが変更されているため、効果的にサイズが小さくなるため、index < al.size()条件が失敗します。代わりにこれを試してみてください:

また
for (int index = 0, n = al.size(); index < n; index++) 
    al.remove(0); 

、この解決策は、(それが周りの要素をコピーすることはもはや必要です)、それをより効率的に、最後に要素を削除します。

for (int idx = al.size() - 1; idx >= 0; idx--) 
    al.remove(idx); 
+0

から反復する方がよいかもしれませんあなたはインデックス0の配列リストから何かを削除すると、インデックス1はインデックス0になるということです – f2lollpll

2

ArrayListから要素を削除している間、そのインデックスが更新されているためです。したがって、位置0の要素を削除し、位置1の要素はインデックス0の位置になります。したがって、インデックス1の要素を削除すると、元のインデックス2の要素が削除されます(ArrayListなど)。

1

アイテムを削除すると、リストが縮小します。

、あなたのインデックスが今1である、あなたはインデックスで今1

になります2、原因を取り除くのは、あなたが項目0 1及び2

あなたのインデックスは0

であるあなたは0を削除するとしましょうセンス?

+0

はい、意味があります...ありがとう – Arianule

1

リストから要素を削除すると、リストのサイズは減少しますが、インデックスは増加するため、リストの半分しか空ではないのが普通です。そして彼らは真ん中で会う。本当に要素を1つずつ削除したい場合は、最後の要素から最初の要素まで削除します。

while (!al.isEmpty()) 
{ 

    al.remove(al.indexOf(al.size()-1)); 

} 
2

ここで、要素をもう一度削除してみましょう。あなたが削除して要素を追加するたびに、al.size()によって返される値は減少します。それは、あなたが望む時間の半分だけ反復することを意味します。

修正はこれを行うことです。

int size = al.size(); 
for(int index = 0; index < size; index++) { 

です。この方法ではサイズは変わりません。

覚えておくべき他の事は、私はそれがポイントだかわからないので、

int index = al.size(); index >=0 ; index-- 
+0

'int index = al.size()'はArrayListの有効なインデックスではありません。正しい式は 'int index = al.size ()-1' –

+0

本当に、それはポイントを伝えることでした。コードをコピー&ペーストしない – rayred

関連する問題