Sortieren eines Sets

  • 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 :(

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

    EVC Tutor

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


    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;

  • 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

  • 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

  • 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

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

  • 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

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

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

    (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.

    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.


    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.

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

Jetzt mitmachen!

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