Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich habe ein Hash Set von Strings ich will dieses Set jetzt halbieren und eine hälfte removen dass hash Set wird dannach noch verändert dass sage ich da ich online gelesen habe dass es dann zu Problemen kommen kann wenn man ein hash set ändert nachdem man den Iterator erstellt hat wie mache ich das am besten ? Falls ihr Mehr Infos braucht oder Code sehen wollt teile ich gerne aber denke dass es eher was allgemeines ist
Da ist jetzt die Frage, was genau Du für Veränderungen hast und wie Du damit umgehen willst.
Das erste Problem ist: Iterator und entfernen von Elementen. Das kannst Du lösen, in dem Du die remove Methode des Iterators nutzt (so der Iterator das unterstützt).
Wenn Du mehrere Threads hast, die auf das Set zugreifen, dann wird es ggf. schwerer. Da ist die Frage, wie Du auf die Veränderung reagieren willst. Das ist halt noch nicht genau festgelegt. Beispiel: Du hast 10 Elemente im Set. Du willst die Hälfte entfernen. Während Du 5 Elemente entfernst werden aber nun 2 weitere Elemente hinzugefügt. Sollen diese noch berücksichtigt werden?
Je nachdem, was das genaue Problem ist, kann man das per Code lösen. Du kannst Zugriffe auf das Set synchronisieren: Solange ein Prozess läuft können keine anderen Dinge passieren. Sprich: Das Hinzufügen von den 2 Elementen kann erst erfolgen, wenn das Entfernen der 5 Elemente erfolgt ist. Das ist nur eine Möglichkeit.
Daher ist wirklich immer die Frage wichtig, die ich am Anfang gestellt habe: Was passiert alles mit dem Set und was für ein Verhalten erwartest Du?
Ja an remove hatte ich auch schon gedacht und etwas rum probiert jedoch stoße ich immer sobald ich ein remove habe auf den selben irrsinnig langen Fehler den ich nicht entziffern kann
Java:
public void amnesia() {
System.out.println("Amnesia Pressed"); //Bestätigung dass Methode aufgerufen wurde / Button gedrückt
Iterator<String> It = bannedSituations.iterator(); //Iterator für Set banned Situations anlegen
int size = bannedSituations.size(); //größe des Sets
for (int i = 1; i <= size / 2; i++) { //For Schleife die solange aufgerufen wird bis die hälfte des Sets durch ist
String str = It.next();
bannedSituations.remove(str);
System.out.println(str);
}
storeMemory(); // neues set wird abgespeichert
}
Der Fehler bzw Konsolen ausgabe:
Amnesia Pressed
Exception in thread "JavaFX Application Thread"
[ B/BW / B/WW /]@W <- Das ist der Print von System.out.println(str);
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at javafx.fxml@18.0.1/javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1857)
at javafx.fxml@18.0.1/javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1724)
at javafx.base@18.0.1/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at javafx.base@18.0.1/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234)
at javafx.base@18.0.1/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at javafx.base@18.0.1/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at javafx.base@18.0.1/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at javafx.base@18.0.1/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@18.0.1/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base@18.0.1/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@18.0.1/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base@18.0.1/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@18.0.1/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at javafx.base@18.0.1/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.base@18.0.1/javafx.event.Event.fireEvent(Event.java:198)
at javafx.graphics@18.0.1/javafx.scene.Node.fireEvent(Node.java:8797)
at javafx.controls@18.0.1/javafx.scene.control.Button.fire(Button.java:203)
at javafx.controls@18.0.1/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:208)
at javafx.controls@18.0.1/com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274)
at javafx.base@18.0.1/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:247)
at javafx.base@18.0.1/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at javafx.base@18.0.1/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234)
at javafx.base@18.0.1/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at javafx.base@18.0.1/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at javafx.base@18.0.1/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at javafx.base@18.0.1/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@18.0.1/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base@18.0.1/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@18.0.1/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base@18.0.1/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@18.0.1/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at javafx.base@18.0.1/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.base@18.0.1/javafx.event.Event.fireEvent(Event.java:198)
at javafx.graphics@18.0.1/javafx.scene.Scene$MouseHandler.process(Scene.java:3881)
at javafx.graphics@18.0.1/javafx.scene.Scene.processMouseEvent(Scene.java:1874)
at javafx.graphics@18.0.1/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2607)
at javafx.graphics@18.0.1/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:411)
at javafx.graphics@18.0.1/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:301)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at javafx.graphics@18.0.1/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:450)
at javafx.graphics@18.0.1/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:424)
at javafx.graphics@18.0.1/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:449)
at javafx.graphics@18.0.1/com.sun.glass.ui.View.handleMouseEvent(View.java:551)
at javafx.graphics@18.0.1/com.sun.glass.ui.View.notifyMouse(View.java:937)
at javafx.graphics@18.0.1/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics@18.0.1/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:119)
at java.base/java.lang.reflect.Method.invoke(Method.java:577)
at com.sun.javafx.reflect.Trampoline.invoke(MethodUtil.java:77)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:577)
at javafx.base@18.0.1/com.sun.javafx.reflect.MethodUtil.invoke(MethodUtil.java:275)
at javafx.fxml@18.0.1/com.sun.javafx.fxml.MethodHelper.invoke(MethodHelper.java:84)
at javafx.fxml@18.0.1/javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1852)
... 46 more
Caused by: java.util.ConcurrentModificationException
at java.base/java.util.TreeMap$PrivateEntryIterator.nextEntry(TreeMap.java:1486)
at java.base/java.util.TreeMap$KeyIterator.next(TreeMap.java:1540)
at MiniChessKernelV03/memory.MiniChessBasicMemory.amnesia(MiniChessBasicMemory.java:101)
at MiniChessApplicationV03/view.stages.primary.MiniChessGUIController.handleAmnesieButton(MiniChessGUIController.java:201)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
... 53 more
Update: Ich habe gerade herausgefunden dass es mit der for-Schleife zusammen hängen muss wenn ich diese ausklammere und somit nur das erste element des sets entferne funktioniert alles blendend was aber mit der For schleife falsch ist weiß ich nicht
Ich habe ein Hash Set von Strings ich will dieses Set jetzt halbieren und eine hälfte removen dass hash Set wird dannach noch verändert dass sage ich da ich online gelesen habe dass es dann zu Problemen kommen kann wenn man ein hash set ändert nachdem man den Iterator erstellt hat wie mache ich das am besten
Zwischendrin mal ein Punkt oder Komma wäre ganz nett gewesen
Der Vollständigkeit halber sei noch retainAll() bzw. removeAll() erwähnt: erst die zu behaltenden bzw. zu löschenden Elemente in z. B. einem neuen Set speichern und dann als Parameter der betreffenden Methode verwenden. Das wäre insbesondere verwendbar, wenn man am Ende zwei Sets haben möchte. Auch removeIf() kann ggf. zur Anwendung kommen. Das hängt aber alles vom Einzelfall ab.