1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Sortieren eines Sets

  • Tuxa
  • 11. Juni 2011 um 23:44
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • Tuxa
    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 :(

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

  • sutupud
    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.

  • Tuxa
    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.

  • Tuxa
    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)

  • Tuxa
    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!!!

  • sutupud
    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.

  • Tuxa
    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 :)

  • JohnFoo
    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
    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.

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

  1. Datenschutzerklärung
  2. Impressum