List削除指定要素
jdk 1.5は快速で便利なfor eachを出しましたので、私達は符号化の過程で便利なのは全部for eachです.フォーマットは以下の通りです.
ConcerentModificationException異常、 ローズマリー自身のremove方法で除外します.
さらに次のように説明します.
for-eachを使って実際に使っているのは、Iteratorディケンサです.
Iteratorの作業メカニズム:
Iteratorは独立したスレッドの中で動作し、mutexロックを持っています.つまりIteratorは仕事をする時、反復される対象が変更されることは許されません.Iteratorが作成されたとき、メモリインデックステーブル(シングルチェーンテーブル)が作成されました.このインデックステーブルは元のオブジェクトを指しています.元のオブジェクトの数が変わると、このインデックステーブルの内容は同期されていないので、インデックスポインタが下に移動すると、反復する対象が見つからなくなり、エラーが発生します.List、Setなどはダイナミックで、可変の対象数のデータ構造ですが、Iteratorは一方向に可変ではなく、順番にしか読み取れず、逆順に操作できないデータ構造です.Iteratorが指す元のデータが変化すると、Iterator自身は方向を見失います.
指定した要素を削除するにはどうすればいいですか?以下はいくつかの解決方法です.
一. 削除するデータをListで記録し、最後にremoveAll(List)を記録する.
for(Object o : objList)
{
...
}
今のシーンでは、ObjListの中のいくつかの要素を削除する必要があります.自然と、私達は次のような文を習慣的に書きます.int i = 0;
for(Object o : objList)
{
if(o == value)
{
objList.remove(i);
}
i++;
}
この時に新聞を見つけます. java.util.C.oncurrent ModificationExceptionの異常は、この異常はローズマリーが投げた異常で、公式の説明は以下の通りです.The Iterators returned by this class's iterator method are fail-fast: if the set is modified at any time after the iterator is created, in any way except through the iterator's own remove method, the iterator will throw a ConcurrentModificationException. Thus, in the face of concurrent modification, the iterator fails quickly and cleanly, rather than risking arbitrary, non-deterministic behavior at an undetermined time in the future.
ローズマリーで集合を反復するときは、いったん作成されたら、集合の変更は許可されません.反復されたセット(SetまたはList)の変更があれば、投げ出します. ConcerentModificationException異常、 ローズマリー自身のremove方法で除外します.
さらに次のように説明します.
for-eachを使って実際に使っているのは、Iteratorディケンサです.
Iteratorの作業メカニズム:
Iteratorは独立したスレッドの中で動作し、mutexロックを持っています.つまりIteratorは仕事をする時、反復される対象が変更されることは許されません.Iteratorが作成されたとき、メモリインデックステーブル(シングルチェーンテーブル)が作成されました.このインデックステーブルは元のオブジェクトを指しています.元のオブジェクトの数が変わると、このインデックステーブルの内容は同期されていないので、インデックスポインタが下に移動すると、反復する対象が見つからなくなり、エラーが発生します.List、Setなどはダイナミックで、可変の対象数のデータ構造ですが、Iteratorは一方向に可変ではなく、順番にしか読み取れず、逆順に操作できないデータ構造です.Iteratorが指す元のデータが変化すると、Iterator自身は方向を見失います.
指定した要素を削除するにはどうすればいいですか?以下はいくつかの解決方法です.
一. 削除するデータをListで記録し、最後にremoveAll(List)を記録する.
List<Integer> removeList = new ArrayList()
for(Integer i : intList)
{
if(i == 13)
{
removeList.add(i);
}
}
//
if(removeList.size()>0)
{
intList.removeAll(removeList);
}
二.for循環で遍歴し、オリジナルの書き方for(int i = 0; i < intList.size(); i++)
{
if(intList.get(i) == 13)
{
intList.remove(i);
// , list ,
i--;
}
}
三.ローズマリーで持参したremoveの方法は、これも公式のオススメです.Iterator <Integer> it = intList.iterator();
while(it.hasNext())
{
if(it.next() == 13)
{
it.remove();
}
}