Zum Inhalt springen

TreeSet mit doppelten Einträgen???


Commander_COM

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ungetestet fällt mir auf, dass dein Comparator nicht wirklich logisch erscheint.

Eigentlich erwarte ich, dass wenn

a.compareTo(B) = 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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

  }


}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich dachte ich schaue einfach, ob in der Zielliste das Objekt schon vorhanden ist
Damit 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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich brauche aber den vergleich noch von zwei weiteren attributen, getFarbe und getForm
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);

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...