ArayListを巡回し、いくつかの要素を削除する方法で実現しました.

2177 ワード

この文章は根拠です https://blog.csdn.net/qq_32575047/articale/detail/78902254 の招待状を整理しました.ここで感謝します.
タイトル:ArayListオブジェクトaListの中にいくつかの文字列要素が存在していますが、現在はArayListオブジェクトを巡回して、その中のすべての値が「abc」の文字列要素を削除したいです.コードで実現してください.
public class Test1 {  
  
    public static void main(String[] args) {  
        ArrayList aList = new ArrayList();  
        aList.add("a");  
        aList.add("ab");  
        aList.add("abc");  
        aList.add("abcr");  
        aList.add("abc");  
        aList.add("abcf");  
        aList.add("abc");  
        aList.add("abdc");  
          
        for(int i = 0;i 
出力結果は、[a,ab,abcr,abcf,abdc]
ローズマリーを使って巡回することもできます.
Iterator iter = aList.iterator();  
        while(iter.hasNext()){  
            if(iter.next().equals("abc")){  
                iter.remove();  
                  
            }  
結果は上と同じです.
今はaListを修正して、データ「abc」を追加します.  , 上の二つのコードをもう一度実行して、違いがありますか?
ArrayList aList = new ArrayList();  
        aList.add("a");  
        aList.add("ab");  
        aList.add("abc");  
        aList.add("abc");  //       
        aList.add("abcr");  
        aList.add("abc");  
        aList.add("abcf");  
        aList.add("abc");  
        aList.add("abdc");  
その後、forを循環して、結果は次のようになります.
[a,ab,abc,abcr,abcf,abdc]  「abc」が除去されていないことが分かった.
しかし、ローズマリーを使って、答えは正しいです.すべての「abc」が取り除かれました.
このような状況が発生した原因は何ですか?
ArayListの底のデータ構造は配列であるため、配列の特性については、いずれかの要素が削除されると、その要素の後ろのすべての要素が前の位置に移動し、この特性を組み合わせて、先ほどのforサイクルに戻ると、なぜ「abc」が削除されたのかをよく説明することができる.
for(int i = 0;i 
次のように改善できます.
for(int i = 0;i 
または、次のように改善されます.
for(int i = aList.size() -1 ;i >= 0 ; i--){  
    if(aList.get(i).equals("abc")){  
       aList.remove(i);  
    }  
}  
このような問題がないのは、has Next()の方法のためです.原理は、ポインタが後ろに移動して、it.next()を実行するたびに、ポインタが後ろに移動して、一つ一つの遍歴があります.このような問題を避けるためには、できるだけサンデーを使ったほうがいいです.