Commander_COM Geschrieben 26. April 2005 Geschrieben 26. April 2005 Hi, ich krieg hier langsam ne Krise... seit 6 Stunden versuche ich ein Treeset zu basteln, was keine doppelten Einträge drin hat. Set t = new TreeSet©; t bekommt eine LinkedList mit Objekten übergeben. die Klasse der Objekte hab ich die compareTo Methode von Compareable überschrieben. Sieht so aus: public int compareTo(Object s) { if( (this.getFarbe()).equals( ((Schmetterling)s).getFarbe() ) & (this.getForm()).equals( ((Schmetterling)s).getForm() ) & (this.getMuster()).equals( ((Schmetterling)s).getMuster() ) ) { return 0; } else return 1; } Warum zum Henker, sieht der Inhalt meines Treeset nach Übergabe der LinkedList dann so aus?????: Schmetterling: punkte rot gerade 1. !!!!! Schmetterling: kreise rot gerade Schmetterling: punkte rot krumm 2. !!!!! Schmetterling: punkte rot gerade 1. !!!!! Schmetterling: kreise rot krumm Schmetterling: punkte rot krumm 2. !!!!! Die müsste es doch eliminieren?!?!?! hilfe... ich krieg nen Koller 6h Java ohne Pause ist nicht gesund Zitieren
geloescht_Newlukai Geschrieben 27. April 2005 Geschrieben 27. April 2005 Comparator ist doch nur für die Sortierung zuständig?!? Vielleicht solltest Du vor dem Hinzufügen nachschauen, ob das Objekt schon im Set existiert (contains). Dazu müßtest Du wohl auch equals von Schmetterling überschreiben. Zitieren
perdian Geschrieben 27. April 2005 Geschrieben 27. April 2005 Ungetestet fällt mir auf, dass dein Comparator nicht wirklich logisch erscheint. Eigentlich erwarte ich, dass wenn a.compareTo( = 1 ist, dass dann auch gilt b.compareTo(a) = -1 Dies ist bei dir nicht der Fall. Du erhälst entweder 1 oder 0 - was wahrscheinlich für das TreeSet auch ein Ergebnis ist, dass die interne Ordnung durcheinanderbringt. Vielleicht solltest Du vor dem Hinzufügen nachschauen, ob das Objekt schon im Set existiert (contains).Unsinnig. Es ist ja gerade Sinn und Zweck eines Set, dass jedes Element innerhalb der Datenstruktur nur einmal vorkommen darf. A collection that contains no duplicate elements. Zitieren
Commander_COM Geschrieben 27. April 2005 Autor Geschrieben 27. April 2005 Dies ist bei dir nicht der Fall. Du erhälst entweder 1 oder 0 - was wahrscheinlich für das TreeSet auch ein Ergebnis ist, dass die interne Ordnung durcheinanderbringt. hmm, genau der gedanke kam mir dann auch, ich weiß aber nicht, wie ich das umgehen soll. ich probiere jetzt nochmal eine andere methode Zitieren
perdian Geschrieben 27. April 2005 Geschrieben 27. April 2005 hmm, genau der gedanke kam mir dann auch, ich weiß aber nicht, wie ich das umgehen soll.Du musst einfach eine "richtige" Ordnung für deine Objekte erstellen. Normalerweise bieter sich da einfach die lexikographische Sortierung nach dem Namen an, und du erhälst sowas: class TestClass implements Comparable { public int compareTo(Object o) { TestClass left = this; TestClass right = (TestClass)o; return left.getName().compareTo(right.getName()); } } Zitieren
Commander_COM Geschrieben 27. April 2005 Autor Geschrieben 27. April 2005 Ich dachte ich schaue einfach, ob in der Zielliste das Objekt schon vorhanden ist, leider bekomme ich einen ConcurrentModificationError... :-( LinkedList t = new LinkedList(); ListIterator it2 = t.listIterator(); while(it.hasNext()) { int x=0; Schmetterling FirstSchmett = (Schmetterling)it.next(); while(it2.hasNext()) { Schmetterling SecSchmett = (Schmetterling)it2.next(); if ( (FirstSchmett).compareTo(SecSchmett)==0 ||(FirstSchmett).compareTo(SecSchmett)==0 ||(FirstSchmett).compareTo(SecSchmett)==0 ) {x=1;} } while(it2.hasPrevious()){it2.previous();} if(x==0){t.add(FirstSchmett);}else{x=0;} } Zitieren
Commander_COM Geschrieben 27. April 2005 Autor Geschrieben 27. April 2005 public int compareTo(Object s) { Schmetterling left = this; Schmetterling right = (Schmetterling)s; return left.getMuster().compareTo(right.getMuster()); } dein vorschlag sähe dann so aus oder? ich brauche aber den vergleich noch von zwei weiteren attributen, getFarbe und getForm noch :confused: erst dann sind sie gleich Zitieren
perdian Geschrieben 27. April 2005 Geschrieben 27. April 2005 Ich dachte ich schaue einfach, ob in der Zielliste das Objekt schon vorhanden istDamit hast du dich geschickt um das Problem gedrückt, und wirst dir wahrscheinlich (oh ich sehe gerade LinkedList also nicht wahrscheinlich sondern auf jeden Fall) ein schlechteres Laufzeutverhalten einhandeln. Genau für deinen Fall gibt es das Set-Interface. Das solltest du auch nutzen - und vorher verstehen, warum du es benutzen solltest. Deine ConcurrentModificationException kommt daher, dass du den Iterator, den du vor dem Hinzufügen erzeugt hast, nach dem Hinzufügen weiterverwendest, und das ist nicht erlaubt. RTFM! java.util.LinkedList: The iterators returned by the this class's iterator and listIterator methods are fail-fast: if the list is structurally modified at any time after the iterator is created, in any way except through the Iterator's own remove or add methods, the iterator will throw a ConcurrentModificationException. Thus, in the face of concurrent modification, the iterator fails quickly and cleanly, rather than risking arbitrary, non-deterministic behavior at an undetermined time in the future. Zitieren
perdian Geschrieben 27. April 2005 Geschrieben 27. April 2005 ich brauche aber den vergleich noch von zwei weiteren attributen, getFarbe und getFormDann bau sie doch einfach ein: public int compareTo(Object s) { Schmetterling left = this; Schmetterling right = (Schmetterling)s; String leftString = left.getMuster() + "_" + left.getFarbe() + ... String rightString = right.getMuster() + "_" + right.getFarbe() + ... return leftString.compareTo(rightString); } Zitieren
Commander_COM Geschrieben 27. April 2005 Autor Geschrieben 27. April 2005 RTFM! *g* habe gerade deine signature-links durchgesehen :-P ja das mit dem iterator war mir bekannt, hatte aber gerade die algorithmische idee vorhin und dann programmiert man das schnell und merkt am ende, dass es von vornherein gar nicht gehen kann BÖSER; FAULER ITERATOR:-( ;-) Zitieren
Commander_COM Geschrieben 27. April 2005 Autor Geschrieben 27. April 2005 Dann bau sie doch einfach ein: public int compareTo(Object s) { Schmetterling left = this; Schmetterling right = (Schmetterling)s; String leftString = left.getMuster() + "_" + left.getFarbe() + ... String rightString = right.getMuster() + "_" + right.getFarbe() + ... return leftString.compareTo(rightString); } JAAAAAAAAAAAAAAAAAAAA DANKE!!!!!!!!!!!!!!!! das wars wonach ich suchte *steinvomherzenfall* *schweb* du bist mein Held!!! vielen vielen Dank! Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.