イテレーターを使用してHashSetオブジェクトを追加または削除できない問題について

問題の生成:

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(); // 更改后

通常の操作では、結果は次のとおりです。
ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/SoupTC/article/details/109398618