Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

TreeSet mit doppelten Einträgen???

Empfohlene Antworten

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

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.

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.

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

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

  }


}

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

}

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

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.

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

}

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

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!

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.