TreeSet ändert sich bei Änderungen nicht!

Status
Nicht offen für weitere Antworten.

gpxricky

Mitglied
Hallo,

in meiner Klasse benutze ich einen TreeSet, der nach einem bestimmten Comparator sortiert.
Nehmen wir zur Vereinfach einmal folgendes Beispiel:

Code:
class Test {
    public TreeSet trees = new TreeSet();
    ...
}

class TreeSetElement implements Comparable {
    private GregorianCalendar date = null;

    public TreeSetElement() {
        date = new GregorianCalendar();
    }

    public changeDate() {
        date = new GregorianCalendar(2005, 12, 12, 12, 12, 12);
    }

    public int compareTo(Object o) {
        // Sortiert korrekt nach TreeSetElement.date
    }
}

Bis hierher ist alles schön und gut.
Wenn ich meine Klasse Test habe und dann dem TreeSet immer wieder ein neues TreeSetElement "draufhaue", sortiert er das Element richtig ein!

Das Problem tritt nur auf, wenn ich nun ein bereits im TreeSet vorhandenes TreeSetElement mit changeDate() ändere: Anstatt dieses Element neu einzusortieren, bleibt es an der selben Stelle :-(((!!
Das kann aber nicht sein, es muss (wenn changeDate wirklich wie oben implementiert ist), an das Ende des TreeSets rutschen!

Gibt es irgendwie ne Möglichkeit, dem TreeSet zu sagen, er solle sich neu sortieren, ohne, dass ich das geänderte Element zunächst aus dem TreeSet lösche und dann wieder einfüge?

Vielen Dank für Eure Hilfe

gpxricky
 

gpxricky

Mitglied
Wobei witzigerweise TreeSet.contains() auch false zurückgibt, wenn man durch alle Elemente durchiteriert und an das geändert kommt. Komisch, komisch....
 
B

bygones

Gast
nicht komisch - das Objekt hat sich geändert - die contains beruht auf der equals Methode und wenn die bei der änderung dann false zurückgibt.

dir wird afaik nichts anderes übrige bleiben als
Code:
Set s = new TreeSet(oldSet);
 

gpxricky

Mitglied
Nein, das funktioniert auch nicht :-(.
Das komische ist, dass ich den TreeSet durchlese (mit Iterator), dann jedes Element nehme und schaue, ob es in TreeSet drin ist (eigentlich logisch, dass dann alles drin sein sollte), aber er bringt, dass das Element nicht drin sei.
 

gpxricky

Mitglied
Also jetzt wirds noch komischer: Wenn nicht viele Elemente im TreeSet drin sind, dann funktioniert das removen und dann wieder adden! Ich schau mal, ab wie viel Elementen es nicht mehr funktioniert und meld mich gleich wieder...
 

mic_checker

Top Contributor
Ansonsten musst du halt mal deinen kompletten Source posten

Hab nämlich keine Lust mir die Extension von JProphet runterzuladen....*g*
 

gpxricky

Mitglied
*g* naja, den ganzen Quellcode möchte ich nicht posten. Denke mal, ihr habt keine Lust 1500 Zeilen Code durchzulesen, oder?

Also: Folgendermaßen hats jetzt funktioniert, allerdings ist das mächtig mächtig aufwendig, denn ich kopiere jetzt manuell alles vom TreeSet (und die Elemente können ja auch wieder nen TreeSet haben und die dann auch wieder, und und und) neu in einen anderen TreeSet rüber. Das ist meiner Meinung irgendwie ziemlich absurd, aber ich habe keine Ahnung, warum das andere nicht funktioniert.
 

Wildcard

Top Contributor
Wenn du ein Date ändern willst, und das TreeSet danach noch sortiert sein soll musst du das von aussen machen:
Code:
treeSet.remove(treeSetElement);
treeSetElement.machwas();
treeSet.add(treeSetElement);
Wenn du jetzt noch equals und compareTo richtig überschrieben hast passt das...
 

gpxricky

Mitglied
Ok, also ich hab jetzt mal ein Beispiel ;-):

Ich habe den Code nicht kommentiert und hoffe, dass er selbsterklärend ist (Kommentare mussten aus Zeitgründen ausbleiben - will schließlich auch irgendwann ins Bett):

Code:
package forum;
import java.util.*;

public class Testklasse implements Comparable {
  public TreeSet tasks = null;
  private GregorianCalendar date = null;
  private String name = null;
  
  public Testklasse(String text) {
    date = new GregorianCalendar();
    tasks = new TreeSet();
    name = text;
  }
  
  public GregorianCalendar getDate() {
    return date;
  }
  
  public String getName() {
    return name;
  }
  
  public void setDate(GregorianCalendar datum) {
    date = datum;
  }
  
  public Testklasse addNew(String text) {
    Testklasse test = new Testklasse(text);
    this.tasks.add(test);
    return test;
  }

  /**
   * compareTo
   *
   * @param o Object
   * @return int
   */
  public int compareTo(Object o) {
    Testklasse test = (Testklasse)o;
    if (date.after(test.getDate())) {
      return 1;
    } else if (date.before(test.getDate())) {
      return -1;
    } else {
      return name.compareTo(test.getName());
    }
  }
}

****************************************************

package forum;
import java.util.*;

public class Forum {

  public static void main(String args[]) {
    Testklasse changer = null;
    int id = 0;
    Testklasse go = new Testklasse("A" + Integer.toString(id));
    Testklasse sicherung = null;
    while (id < 20) {
      id++;
      Testklasse neu = go.addNew("A" + Integer.toString(id));
      if (id == 2) {
        sicherung = neu;
        id++;
        changer = neu.addNew("A" + Integer.toString(id));
        while (id < 10) {
          id++;
          neu.addNew("A" + Integer.toString(id));
        }
      }
    }
    changer.setDate(new GregorianCalendar(2005, 12, 12, 12, 12,12));
    System.out.println("Aus " + sicherung.getName() + " " + changer.getName() + " löschen und neu einfügen");  
    System.out.println(changer.getName() + " gefunden?" + sicherung.tasks.contains(changer));
    System.out.println(changer.getName() + " löschen?" + sicherung.tasks.remove(changer));
    System.out.println(changer.getName() + " neu einfügen?" + sicherung.tasks.add(changer));
    Forum test = new Forum();
    test.OutputTestklasse(go);
  }
  
  public void OutputTestklasse(Testklasse main) {
    Iterator itrTasks = main.tasks.iterator();
    while (itrTasks.hasNext()) {
      Testklasse p = (Testklasse)itrTasks.next();
      System.out.println(p.getName() + " ist in dem Unterbaum von " + main.getName() + "? " + main.tasks.contains(p));
      OutputTestklasse(p);
    }
  }
}

Und jetzt probierts einmal aus, indem ihr z.B. in der main-Methode den Befehl changer.setDate(new GregorianCalendar(2005, 12, 12, 12, 12, 12)) ausklammert oder probierts mal, wenn ihr diese Zeile drin lasst, aber die anderen 4 Zeilen drunter ausklammert (also die System.out.println-Zeilen).

Na? Ich hoffe, ihr bekommt auch die Ergebnisse, die ich rausbekommen hab ;-)

Gruß

gpxricky
 

Wildcard

Top Contributor
Was willst du denn jetzt hören? Macht doch genau das was zu erwarten war.
Du musst das so machen wie ich schon weiter oben geschrieben hab:
entfernen -> verändern -> hinzufügen
 

gpxricky

Mitglied
Naja, prinzipiell schön und gut, aber ich kann nicht zuerst den Eintrag aus dem TreeSet entfernen und dann wieder hinzufügen, da mein Programm etwas anders aussieht als das obige. z.B. bekommt die Testklasse, die im TreeSet changer hat, eine Änderung von changer nur mittles Observer-update-Methode mit und dann ist es ja leider schon zu spät :-(.
Oder gibt es eine Möglichkeit, direkt von (im Beispiel jetzt) changer zu sagen:

Code:
TreeSet reload = (TreeSet)changer.parent;
reload.remove(this);
changer.setDate(..)
reload.add(this)
 

Bleiglanz

Gesperrter Benutzer
nur zu deiner Info:

das ganze Collection API basiert darauf, dass Objektreferenzen gespeichert werden

ändert sich ein bereits in irgendeiner Collection vorhandenes Element, so hat das überhaupt keine Auswirkungen, ggf. führt das aber zu leichten Inkonsistenzen

aber ich kann nicht zuerst den Eintrag aus dem TreeSet entfernen und dann wieder hinzufügen, da mein Programm etwas anders aussieht
musst du aber, wenn du die Sortierung erhalten willst
 

Wildcard

Top Contributor
gpxricky hat gesagt.:
Naja, prinzipiell schön und gut, aber ich kann nicht zuerst den Eintrag aus dem TreeSet entfernen und dann wieder hinzufügen, da mein Programm etwas anders aussieht als das obige.
Zeit das Klassendesign zu überdenken :wink:
 

gpxricky

Mitglied
*lach* ne ne, das ist jetzt schon hundertmal über den Haufen geworfen worden ;-).
Ok, ich habs mittlerweile so hinbekommen, dass ich einigermaßen zufrieden bin (auch von der Performance her).

Vielen lieben Dank für eure Hilfe

gpxricky
 

Wildcard

Top Contributor
gpxricky hat gesagt.:
*lach* ne ne, das ist jetzt schon hundertmal über den Haufen geworfen worden ;-).

gpxricky

Also hundert Fehler die du nächstes mal nicht mehr machst. Nur dank dieser Fehler gibt es überhaupt Design-Patterns :D
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Collections Fragen zu gleichen Elementen in TreeSet Allgemeine Java-Themen 35
T Collections TreeSet.contains ruft nicht .equals? Allgemeine Java-Themen 4
B TreeSet-Ausgeben Allgemeine Java-Themen 8
B Collections TreeSet/TreeMap, doppelte Einträge zulassen ? Allgemeine Java-Themen 11
K Collections TreeSet beinhaltet Objektleichen Allgemeine Java-Themen 26
S TreeSet - Comparator ändern -> resort? Allgemeine Java-Themen 8
M Vergleich von TreeSet<HashSet>^2 Allgemeine Java-Themen 8
H Problem beim Sortieren einer HashMap mit TreeSet Allgemeine Java-Themen 4
A Effizienzfrage bei TreeSet / XML-Verarbeitung Allgemeine Java-Themen 8
C TreeSet mit Objekten befüllen Allgemeine Java-Themen 12
J TreeSet und Comparator will nicht so wie ich Allgemeine Java-Themen 2
J unsortiertes Treeset Allgemeine Java-Themen 2
J TreeSet neues TreeSet aufbauen Allgemeine Java-Themen 8
S Verhalten der Klasse TreeSet... Allgemeine Java-Themen 4
S TreeSet benötigt zu viel Speicher Allgemeine Java-Themen 5
André Uhres BigDecimal in HashSet eingefügt, aber nicht in TreeSet Allgemeine Java-Themen 2
M TreeSet exception bei add Allgemeine Java-Themen 17
E Statt HashSet die TreeSet verwenden Allgemeine Java-Themen 4
M Fehler in TreeSet.remove() Allgemeine Java-Themen 6
B String Array aus TreeSet Allgemeine Java-Themen 6
T TreeSet neu sortieren Allgemeine Java-Themen 4
kodela Inhalt eines Arrays ändert sich mysteriös Allgemeine Java-Themen 2
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
D Best Practice Gesamten Bildschirminhalt auslesen und Email schicken sobald kein Pixel sich ändert Allgemeine Java-Themen 11
F Wert ändert sich nicht Allgemeine Java-Themen 12
B Berechnung eines sinh abbrechen, wenn 16. Nachkommastelle sich nicht mehr ändert Allgemeine Java-Themen 7
A Drucken ändert aktuelles Verzeichnis Allgemeine Java-Themen 2
T JProgressbar ändert werte nicht Allgemeine Java-Themen 28
M Setter-Methode wird aufgerufen aber ändert nichts? Allgemeine Java-Themen 8
N Wert in ArrayList ändert sich ohne wissentliches zutun Allgemeine Java-Themen 6
A Variable ändert sich nicht Allgemeine Java-Themen 15
N Lwjgl 3d Objekt wird schmaler, wenn es sich dreht Allgemeine Java-Themen 0
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
A Eclipse hängt sich auf Allgemeine Java-Themen 7
D Image bewegt sich nicht nach Klicken auf Button Allgemeine Java-Themen 15
Viper13125 Eclipse Hängt sich auf, wenn ich SimpelDateFormat drin lasse Allgemeine Java-Themen 2
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
Tiago1234 Warum hängt sich mein Programm auf? Allgemeine Java-Themen 22
C Parsen einer sich updatenden Html mithilfe von jsoup Allgemeine Java-Themen 4
Kiki01 Häufigster Buchstabe lässt sich nicht ermitteln Allgemeine Java-Themen 30
Tobero Wie berechnet man ob zwei Linien sich schneiden? Allgemeine Java-Themen 2
T Projekt baut nicht mehr/lässt sich nicht mehr ausführen Allgemeine Java-Themen 6
Tobero Wie bekomme ich in welchem Quadrat sich eine Position in einem Grid befindet Allgemeine Java-Themen 11
O Jar lässt sich auf bestimmten Pc nicht starten Allgemeine Java-Themen 18
D Anfänger versucht sich an Xtext Allgemeine Java-Themen 0
F Sich automatisch aufrufende Java-Methoden Allgemeine Java-Themen 2
P JavaFX Anwendung beendet sich selbst nur als Jar Allgemeine Java-Themen 40
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
A 2D-Grafik Einfachster Ansatz, um sich wiederholende Figur in einem 2D-Image zu erkennen Allgemeine Java-Themen 1
M String lässt sich nicht Zusammenfügen Allgemeine Java-Themen 10
I Lohnt sich heutzutage der Aufwand einer Portierung für MacOS Allgemeine Java-Themen 8
G Jar lässt sich mit macOS nicht starten Allgemeine Java-Themen 9
H Erste Schritte Ausführbare Dateien lassen sich nicht starten Allgemeine Java-Themen 5
L Excel Datei löscht sich selbst im Programm - Java Allgemeine Java-Themen 3
K OOP Daten addieren sich bei GUI-Eingabe Allgemeine Java-Themen 10
N Quicksort Programm hängt sich auf Allgemeine Java-Themen 6
S Compiler-Fehler Programm verhält sich in Eclipse anders Allgemeine Java-Themen 1
G Beendet sich der Thread selbst?! Allgemeine Java-Themen 3
S Compiler-Fehler IntelliJ Projektdatei lässt sich nicht erstellen. Allgemeine Java-Themen 15
J Bilder lassen sich nicht importieren Allgemeine Java-Themen 3
E GUI.jfm lässt sich nicht mehr öffnen Allgemeine Java-Themen 1
H Kennt sich jemand mit Eclipse und dem Thema Jar-File aus ? Allgemeine Java-Themen 6
S Programm hängt sich manchmal (selten) auf Allgemeine Java-Themen 9
D System.arraycopy verhält sich seltsam Allgemeine Java-Themen 1
C Threads Methode verhält sich merkwürdig Allgemeine Java-Themen 18
K jar-Datei lässt sich unter Windows nicht verwenden Allgemeine Java-Themen 3
X Sich wiederholende substrings finden Allgemeine Java-Themen 6
P Input/Output Inputstream verhält sich verschieden Allgemeine Java-Themen 9
T Minimax/Alphabeta Algorithmus hängt sich auf (?) Allgemeine Java-Themen 2
Tausendsassa Threads Einen Thread sich selbst schließen lassen Allgemeine Java-Themen 17
K Java installiert sich nicht ganz Allgemeine Java-Themen 15
E Anwendung verhält sich unter Mac anders als Unter Windows. Allgemeine Java-Themen 4
L Jar lässt sich nicht öffnen Allgemeine Java-Themen 12
T BufferedImage verändert sich beim Einlsesen Allgemeine Java-Themen 1
Z Eclipse hängt sich alle paar Sekunden auf (Keine Rückmeldung). Allgemeine Java-Themen 4
L Liste führt sich nicht weiter Allgemeine Java-Themen 5
C .jar File lässt sich nur über Konsole öffnen Allgemeine Java-Themen 1
T Nach Java Update: Jar Datein öffnen sich nicht mehr mit doppelklick Allgemeine Java-Themen 3
M Programm startet sich selbst neu, alte Logfiles bleiben gesperrt Allgemeine Java-Themen 2
J String Variable verändert sich plötzlich Allgemeine Java-Themen 8
K Java lässt sich nicht Installieren Windows7Ultimate 64Bit Allgemeine Java-Themen 1
F JTable mit Zellen die sich durch andere Eingaben füllen Allgemeine Java-Themen 1
E Liste löscht sich selbstständig Allgemeine Java-Themen 5
I JPanel soll sich dem JFrame anpassen Allgemeine Java-Themen 1
ruutaiokwu datenstruktur welche sich "im kreis" dreht Allgemeine Java-Themen 26
D swingset3.jnlp lässt sich nicht ausführen Allgemeine Java-Themen 2
L Prog läuft in der IDE, hängt sich aber am Mac auf Allgemeine Java-Themen 0
F Spiel lässt sich nicht aus GUI starten Allgemeine Java-Themen 5
B Threads halten sich irgendwie auf... Allgemeine Java-Themen 6
G Services verwenden sich gegenseitig Allgemeine Java-Themen 4
A Auswahl eines JEditorPane das Sich in einem JScrollPanel Befindet Allgemeine Java-Themen 2
J kann eine .jar sich selbst verschieben? Allgemeine Java-Themen 6
M Erkennen, in welcher Methode sich die VM befindet Allgemeine Java-Themen 6
Rudolf In wie fern lohnt sich C++ für einen Javaentwickler Allgemeine Java-Themen 70
A Selbsterstellte 404-Seiten bestimmen, die sich als 200 ausgeben Allgemeine Java-Themen 8
D Arrays überschreiben sich Allgemeine Java-Themen 2
G .jar Dateien lassen sich nicht mehr öffnen Allgemeine Java-Themen 2
D Dialog soll sich beim Klick auf Button schließen Allgemeine Java-Themen 8
pg1337 hashCode() verändert sich Allgemeine Java-Themen 15
N Java lässt sich nicht löschen! Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben