1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Sortieren eines Sets

  • Tuxa
  • 11. Juni 2011 um 23:44
  • Unerledigt
  • Tuxa
    3
    Tuxa
    Mitglied
    Punkte
    95
    Beiträge
    15
    • 11. Juni 2011 um 23:44
    • #1

    Hallo!

    Folgende Situation:
    Set<Klasse> set = new Set<Klasse>();
    Klasse enthält 3 Parameter a,b,c, die jeweils public final int sind.

    Jetzt will ich mein Set aufsteigend nach c sortieren, jedoch schaff ichs einfach nicht :frowning_face:

    Zuerst hab ich versucht set in ein 2 dimensionales Array umzuwandeln. (array[a][b] = c)
    Jedoch mag java keine 2 dimensionalen Arrays sortieren -.-
    Also habe ich es zu nem 1 dimensionalen gemacht und aus a, b nen index berechnet, der aufsteigt (0,1,2,3,...). Sortieren hat geklappt, aber durchs sort wandern ja die Datensätze an ne andere Position, also klappt das auch nicht.

    Mit ner Liste wills auch nicht hinhauen.... ich weiß nicht mehr weiter :frowning_face:

    EVC Tutor

  • sutupud
    13
    sutupud
    Mitglied
    Reaktionen
    59
    Punkte
    1.659
    Beiträge
    320
    • 12. Juni 2011 um 00:06
    • #2

    Am besten dafür geeignet ist ein TreeSet. zB:

    PHP
    TreeSet<Object> ts = new TreeSet<Object>(new Comparator<Object>() {
    
    
    			@Override
    			public int compare(Object o1, Object o2) {
    				return o1.hashCode() - o2.hashCode();
    			}
    
    		});
    
    		ts.add(new Object());
    		System.out.println(ts);
    		ts.add(new Object());
    		System.out.println(ts);
    		ts.add(new Object());
    		System.out.println(ts);
    		ts.add(new Object());
    		System.out.println(ts);
    Alles anzeigen


    die objekte landen beim einfügen immer gleich an der richtigen position. einface ts.addAll(otherSet) --> fertig
    wenn deine 'Klasse' comparable implementiert kannst du dir den Comparator sparen.

    "All through my life I've had this strange unaccountable feeling that something was going on in the world, something big, even sinister, and no one would tell me what it was."
    "No," said the old man, "that's just perfectly normal paranoia. Everyone in the Universe has that."

    &#128513;&#128514;&#128515;&#128516;&#128517;&#128518;&#128519;&#128520;&#128521;&#128522;&#128523;&#128524;&#128525;&#128526;&#128527;&#128528;&#128530;&#128531;&#128532;&#128534;&#128536;&#128538;&#128540;&#128542;&#128544;&#128545;&#128546;&#128547;&#128549;&#128552;&#128553;&#128554;&#128555;&#128557;&#128560;&#128561;&#128562;&#128563;&#128565;&#128566;&#128567;

  • Tuxa
    3
    Tuxa
    Mitglied
    Punkte
    95
    Beiträge
    15
    • 12. Juni 2011 um 00:33
    • #3

    Danke für den Tipp! Ich check zwar nicht den Parameter den du da mitgibst (wieso subtrahiert man da die hashCodes? Oo), aber es funktioniert ansatzweise:
    Jetzt wirds es nämlich aufsteigend nach a sortiert, jedoch sollte es aufsteigend nach c sortiert werden.

    EVC Tutor

  • Tuxa
    3
    Tuxa
    Mitglied
    Punkte
    95
    Beiträge
    15
    • 12. Juni 2011 um 00:39
    • #4

    Okay, habe mir jetzt die api durchgelesen und habs dementsprechend umgeändert, sodass nicht der hashCode verwendet wird, sondern Parameter c:
    return o1.c - o2.c;

    Funktioniert auch soweit, nur fallen mir jetzt doppelte Einträge weg - sprich, wenn zB schon nen Eintrag existiert der 2 ist, kommt kein 2. Eintrag rein, der auch 2 ist (c = 2)

    EVC Tutor

  • Tuxa
    3
    Tuxa
    Mitglied
    Punkte
    95
    Beiträge
    15
    • 12. Juni 2011 um 00:51
    • #5

    Oki konnte das jetzt auch selber lösen:
    if(o1.weight - o2.weight == 0)
    return o1.weight;

    Danke nochmal für den Tipp mit dem TreeSet - funzt jetzt einwandfrei!!!

    EVC Tutor

  • sutupud
    13
    sutupud
    Mitglied
    Reaktionen
    59
    Punkte
    1.659
    Beiträge
    320
    • 12. Juni 2011 um 01:00
    • #6
    Zitat von Tuxa

    Oki konnte das jetzt auch selber lösen:
    if(o1.weight - o2.weight == 0)
    return o1.weight;

    Danke nochmal für den Tipp mit dem TreeSet - funzt jetzt einwandfrei!!!



    die einträge sind dir weg gefallen, weil wenn compare 0 zurück liefert werden die elemente als gleich angesehen, und ein set kann nun mal keine gleichen werte enthalten.
    wie du's oben machst sagst du dass o1 in jeden fall größer ist alls o2 (angenommen weight > 0)...
    besser wärs sich zu überlegen, welches element wirklich als größer gesehen werden kann, eventuell spielen die anderen parameter ja auch eine rolle. dann hättest du nämlich eine stabile sortierreihenfolge, so ist die position von 'gleichen' elementen mehr oder weniger zufällig.

    "All through my life I've had this strange unaccountable feeling that something was going on in the world, something big, even sinister, and no one would tell me what it was."
    "No," said the old man, "that's just perfectly normal paranoia. Everyone in the Universe has that."

    &#128513;&#128514;&#128515;&#128516;&#128517;&#128518;&#128519;&#128520;&#128521;&#128522;&#128523;&#128524;&#128525;&#128526;&#128527;&#128528;&#128530;&#128531;&#128532;&#128534;&#128536;&#128538;&#128540;&#128542;&#128544;&#128545;&#128546;&#128547;&#128549;&#128552;&#128553;&#128554;&#128555;&#128557;&#128560;&#128561;&#128562;&#128563;&#128565;&#128566;&#128567;

  • Tuxa
    3
    Tuxa
    Mitglied
    Punkte
    95
    Beiträge
    15
    • 12. Juni 2011 um 01:09
    • #7

    Oki nochmal danke für den Hinweis, hab jetzt die anderen beiden Parameter miteinbezogen:
    Wenn die Elemente gleich sind wird zuerst Parameter a überprüft - falls der kleiner ist, wird -1 zurückgegeben (Objekt wird davor eingeordner)
    Falls größer wird +1 zurückgegeben.
    Und falls die wieder gleich sind wird bei Parameter 2 noch geschaut. Falls es komplett dieselben Knoten sind, DANN wird 0 zurückgegeben :)

    EVC Tutor

  • JohnFoo
    20
    JohnFoo
    Mitglied
    Reaktionen
    61
    Punkte
    4.231
    Beiträge
    761
    • 12. Juni 2011 um 20:27
    • #8
    Zitat von sutupud

    Am besten dafür geeignet ist ein TreeSet. zB:

    PHP
    @Override
    public int compare(Object o1, Object o2) {
    	return o1.hashCode() - o2.hashCode();
    }
    Zitat von Tuxa

    (wieso subtrahiert man da die hashCodes? Oo)

    Berechtigte Frage.

    Die Implementierung ist so nicht ganz sicher: Der Vertrag von hashCode() sieht in keiner Weise vor, dass zurückgegebene Werte eine Ordnung haben müssen (siehe API).

    Auch wenn man selbst Autor der verglichenen Klasse und des Comparator ist, und selbst weiß, dass hashCode() so implementiert ist, dass die ID geordnet ist, sollte man potentielle Leser nicht damit verwirren, das man so "um die Ecke" programmiert.

    Zitat von Tuxa

    Funktioniert auch soweit, nur fallen mir jetzt doppelte Einträge weg - sprich, wenn zB schon nen Eintrag existiert der 2 ist, kommt kein 2. Eintrag rein, der auch 2 ist (c = 2)


    Das liegt daran, wie sutupud sagt, dass du ein Set verwendest (gleiche Elemente kommen nur einmal vor), wo du eigentlich eine Liste haben möchtest.

    Zitat von Tuxa


    Oki konnte das jetzt auch selber lösen:
    if(o1.weight - o2.weight == 0)
    return o1.weight;


    Hast du so deine compareTo() implementiert? Solltest du aber nicht. Schau dir mal das Interface von Comparable an, der jenes von Comparator. Beide sagen, dass man bei Gleichheit der Objekte 0 zurückzugeben hat.

    Was du machst, ist auf ein Set so lange einzudreschen, bis es sich wie eine Liste verhält. Mach es gleich richtig, und erspare dir zukünftige Fehler, indem du das Set in einer Liste ablegst, und die Liste dann mit einem Comparator über das Gewicht sortierst.

  • sutupud
    13
    sutupud
    Mitglied
    Reaktionen
    59
    Punkte
    1.659
    Beiträge
    320
    • 13. Juni 2011 um 00:45
    • #9
    Zitat von JohnFoo

    Berechtigte Frage.

    Die Implementierung ist so nicht ganz sicher: Der Vertrag von hashCode() sieht in keiner Weise vor, dass zurückgegebene Werte eine Ordnung haben müssen (siehe API).

    Auch wenn man selbst Autor der verglichenen Klasse und des Comparator ist, und selbst weiß, dass hashCode() so implementiert ist, dass die ID geordnet ist, sollte man potentielle Leser nicht damit verwirren, das man so "um die Ecke" programmiert.



    ich wollte einfach nur schnell ein beispiel angeben bei deim irgendwas nach irgendwas sortiert wird, ich hätte auch strings oder integers oder was auch immer nehmen können... außerdem wollte ich was nehmen was nicht schon comparable ist.

    "All through my life I've had this strange unaccountable feeling that something was going on in the world, something big, even sinister, and no one would tell me what it was."
    "No," said the old man, "that's just perfectly normal paranoia. Everyone in the Universe has that."

    &#128513;&#128514;&#128515;&#128516;&#128517;&#128518;&#128519;&#128520;&#128521;&#128522;&#128523;&#128524;&#128525;&#128526;&#128527;&#128528;&#128530;&#128531;&#128532;&#128534;&#128536;&#128538;&#128540;&#128542;&#128544;&#128545;&#128546;&#128547;&#128549;&#128552;&#128553;&#128554;&#128555;&#128557;&#128560;&#128561;&#128562;&#128563;&#128565;&#128566;&#128567;

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung