まず以下のコードを見てください:
import java.util.LinkedList; import java.util.List; public class DeleteCollection { public static void main(String[] args) { List<String> list = new LinkedList<String>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.add("e"); for(int i=0;i<list.size();i++){ //循环删除集合中的元素 list.remove(i); } System.out.println("还剩余的元素个数:"+list.size()); } }
上記のコードはアイデアに従って正しいはずであり、出力結果も0になるはずです
以下の実際の出力結果を見てください:
残りの要素の数: 2
なぜなのかと疑問に思うかもしれません。コレクションのサイズは動的に変化するため、要素を削除すると、要素内のシリアル番号が再配置され、削除されるべき 2 番目の要素が最初の要素の位置に配置されますが、実際には 3 番目の要素が削除されます。元の削除されたコードにステートメントを追加すると、要素が 1 番目、3 番目、5 番目、などのようになります。 System.out.println("削除される要素: "+list. get(i));確認することができます。
上記の文を追加した後の出力結果:
削除する要素: a
削除する要素: c
削除する要素: e
残りの要素の数: 2
解決策:
原因を調べる理由は、削除したい要素が前に移動したにもかかわらず、i で保存した値が後ろに移動したままであるためです。したがって、i が前に移動するのを防ぎ、1 つ前に移動すれば、要素を削除できます。 2 番目にランク付けされていた要素が 1 番目にランク付けされました。
変更後のコアコード:
for(int i=0;i<list.size();i++){ System.out.println("即将删除的元素:"+list.get(i)); list.remove(i); i--; }
結果:
削除される要素: a
削除される要素:b
削除される要素:c
削除される要素:d
削除される要素: e
の残りの要素の数: 0
以上がこの記事の全内容です。皆さんに気に入っていただければ幸いです。
Java の for ループ削除収集トラップに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。