Informationen zum Problem, dass HashSet-Objekte nicht mithilfe von Iteratoren hinzugefügt oder gelöscht werden können

Die Entstehung des Problems:

Beim Erlernen der HashSet-Klasse ist ein Fall aufgetreten:

Der König des Goldenen Horns hat einen lila goldenen Kürbis, der "Sun Xingzhe", "Xingzhe Sun", "Zhe Xing Sun" enthält. Jetzt gibt es einen "Sun Wukong", sagte er: Lass zuerst meinen Freund "Sun Xingzhe" raus und steck mich dann rein.
Bitte verwenden Sie HashSet- und Monkey-Klassen, um die oben genannten Anforderungen zu erfüllen.

Wenn Sie Iteratoren verwenden, um Operationen wie gewohnt hinzuzufügen und zu löschen:

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);
        }

Ein Fehler wird gemeldet und die Ergebnisse sind wie folgt:
Fügen Sie hier eine Bildbeschreibung ein

Die Lösung des Problems:

1. Theorie

Später habe ich verstanden, dass die Verwendung von Iteratoren dem HashSet-Klassenobjekt entspricht, das vorübergehend seine eigenen Elemente für den Iterator hostet. Wenn Sie also Vorgänge hinzufügen und löschen möchten, müssen Sie diese auch über das Iteratorobjekt ausführen. Wenn Sie sich den Quellcode ansehen, sehen Sie, dass wenn Sie das HashSet-Klassenobjekt direkt im Iterator bearbeiten, die Anzahl der Elementänderungen und die erwartete Anzahl der Änderungen unterschiedlich sind und ein Fehler gemeldet wird. Das Hinzufügen und Löschen von Objekten über Iteratoren verursacht keine Probleme.

2. Üben

Ändern Sie die obige Zeile des Löschvorgangscodes:

// set.remove(o); 原代码
it.remove(); // 更改后

Bei normalem Betrieb sind die Ergebnisse wie folgt:
Fügen Sie hier eine Bildbeschreibung ein

Ich denke du magst

Origin blog.csdn.net/SoupTC/article/details/109398618
Empfohlen
Rangfolge