問題の生成:
HashSetクラスを学習するときにケースに遭遇しました:
キングオブゴールデンホーンには、「Sun Xingzhe」、「Xingzhe Sun」、「ZheXingSun」を含むパープルゴールドのひょうたんがあります。今、「Sun Wukong」があります、と彼は言いました:最初に私の友人「Sun Xingzhe」を出して、それから私を入れてください。
上記の要件を達成するには、HashSetクラスとMonkeyクラスを使用してください。
イテレータを使用して通常どおり操作を追加および削除する場合:
public static void main(String[] args) {
Monkey m1 = new Monkey("孙行者");
Monkey m2 = new Monkey("行者孙");
Monkey m3 = new Monkey("者行孙");
Monkey m = new Monkey("孙悟空");
HashSet set = new HashSet();
set.add(m1);
set.add(m2);
set.add(m3);
System.out.print("现在紫金葫芦里有:");
for (Object s : set) {
System.out.print(s);
}
Iterator it = set.iterator();
while (it.hasNext()){
Object o = it.next(); // 此行运行报错!
if (((Monkey)o).getName().equals("孙行者")){
set.remove(o); // 在此处进行删除操作
System.out.println("\n现在放出“孙行者”");
}
}
System.out.println("现在放入“孙悟空”");
set.add(m);
System.out.print("\n现在紫金葫芦里有:");
for (Object s : set) {
System.out.print(s);
}
エラーが報告され、結果は次のようになります。
問題の解決策:
1.理論
後で、イテレーターの使用は、イテレーターに対して独自の要素を一時的にホストするHashSetクラスオブジェクトと同等であることがわかりました。したがって、操作を追加および削除する場合は、イテレーターオブジェクトを使用して操作を完了する必要もあります。ソースコードを見ると、イテレーターでHashSetクラスオブジェクトを直接操作すると、要素の変更数と予想される変更数が異なり、エラーが報告されることがわかります。イテレーターを使用してオブジェクトを追加および削除しても、問題は発生しません。
2.練習
上記の削除操作コードの行を変更します。
// set.remove(o); 原代码
it.remove(); // 更改后
通常の操作では、結果は次のとおりです。