Java: Vector nach 2 Kriterien sortieren!

twoPhases

Duisburger
Thread Starter
Mitglied seit
23.11.2003
Beiträge
6.425
Hallo,

kann mir jemand sagen wie ich einen Vector nach 2 Kriterien sortieren kann?

Im Vector sind DTOTabelle Objekte, welche sortiert werden sollen, dazu habe ich die compareTo überschrieben.

public int compareTo(DTOTabelle o) {
int xOrder = 0;
if (this.punkte < o.getPunkte()) {
xOrder = 1;
}
return xOrder;
}

Aufgerufen dann so:

Collections.sort(tabelleVector);

Funtioniert auch prima, nur will ich auch noch nach einem zweitem Kriterium sorteren (geschossene Tore). Wie bekomm ich das angestellt?
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Nehmen wir mal an du hast Namen und Vornamen von Menschen. Heißt 2. Kriterium für dich jetzt, dass du erst nach Namen sortieren möchtest und falls mehrere Menschen den gleichen Namen haben, möchtest du sie zusätzlich nach Vornamen sortieren?
 
Richtig, also so:

Adam Müller
Berta Müller
Chris Müller
Adam Nicht
Berta Nicht
 
Mir fällt Spontan die Möglichkeit ein, einfach einen Vektor in einem Vektor zu speichern. also der 1. Vektor ist nach Nachname sortiert und beinhaltet keine Elemente sondern nur einen 2. Vektor, in dem dann alle Vornamen stehen, bei denen die Nachnamen gleich sind.

Ansonsten kannst du auch einfach eine Hashmap oder Sorted List nehmen. Die sind für solche Zwecke eigentlich eher geeignet.

Du kannst aber auch einfach beide Spalten speichern. Alle 3 Klassen (Vektor, Sorted List, Hashmap) verlangen von dir ein Objekt. Wer sagt, dass das unbedingt ein String sein muss? Man nehme irgend einen Datentypen (nehmen wir einfach mal an es wäre ein Array) und speichere es in dem Vektor. Dann kannst du natürlich bei deiner Sortierfunktion das Objekt wieder zum Array casten und auf beide Spalten zugreifen. Ich bin mir nicht ganz sicher aber ich glaube Array stammt nicht vom Objekt ab. Das ist somit nicht möglich aber ein Vektor machts auch und der stammt vom Objekt ab.

---------- Beitrag hinzugefügt um 18:12 ---------- Vorheriger Beitrag war um 18:02 ----------

Kleiner Nachtrag. Was immer du dort speicherst, es benötigt ein .toString. Bin mir da nicht mehr ganz sicher. Gut möglich das das auch ohne Funktioniert. Ich habe damals Listfelder mit einer ID versehen. Ich habe also in dem Listfeld ein Vektor gespeichert, der 2 Elemente hatte. Einmal die ID und einmal den dazugehörigen Text. Die toString Funktion des Vektors regelt dann, was in der Liste eigentlich angezeigt werden soll. So konnte ich eine versteckte ID abspeichern. Solltest du bei der Umsetzung auf Probleme stoßen, so verpasse deinem Objekt einfach eine toString Funktion und schau mal ob es dann funktioniert.
 
Kleines Gedankenexperiment ... hab little_skunks nur überflogen, vll. hat er schon was Vergleichbares gesagt ..

Neue Klasse, nenne wir "Person". Hat zwei Strings, Vor- und Nachname. Implementiert das Interface comparable.

Person A: "Lisel Müller" Person B "Hans Maiser". Comparable wird dann in etwa so implementiert:

1. Fall
A.Vorname < B.Vorname && A.Nachname < B.Nachname
2. FAll
A. Vorname < B.Vorname && A.Nachname > B.Nachname

*e* Muss man halt entsprechend auscoden, also z.B. A.Vorname.compareTo(b.Vorname) < 0 oder so.

usw. so deckst du jeden Fall ab, eben entsprechend den Regeln von comparable (siehe API). Dann machst du dir einen Vector aus den Person-Objekten und kannst den über Collections.Sort sortieren.

Ohne Gewär, könnte m.E. aber klappen. Dann musst du nicht mit verschachtelten Vektoren o.ä. arbeiten.

*e2* Gerade nochmal drüber nachgedacht. Wäre zwar m.E. möglich, man muss das compareTo aber mit ordentlich vielen cases überschreiben ... auch nicht so toll. ;)
 
Zuletzt bearbeitet:
Das geht ziemlich intuitiv. Vergleiche Nachnamen. Wenn Nachnamen gleich, vergleiche Vornamen:

Code:
class X implements Comparable {
  public String vorname;
  public String nachname;

  public int compareTo(Object o) {
    X o2 = (X)o;
    int cmp = this.nachname.compareTo(o2.nachname);
    if (cmp == 0)
      cmp = this.vorname.compareTo(o2.vorname);
    return cmp;
  }
}
 
Ich versteh nicht ganz, warum du nicht einfach ein stabiles Sortierverfahren nimmst und dann erstmal nach Nachnamen und dann nach Vornamen sortierst. Die relative Lage der Elemente zueinander bleibt dabei ja erhalten. Du musst dir eben nur zwei verschiedene Compare-Funktionen basteln, aber das ist jetzt auch nicht der große Wahnsinn.
 
Das funktioniert wiederrum nicht. Er will nicht 2 verschiedene Sortierungen sondern 1 Sortierung mit 2 Kriterien. Der Quellcode von infinity_dev ist da genau richtig.
 
Du hast mich nicht verstanden. Er soll den Vektor erst nach Kriterium 1 sortieren (mit einem stabilen Sortierverfahren) und diesen sortierten Vektor dann mit demselben Verfahren nach Kriterium 2 sortieren. Dabei kommt genau das heraus, was er oben mit den Namen demonstriert hat.
 
Ich habe dich anscheinend wirklich nicht verstanden. So wie ich dich verstehe soll er nach oberen Beispiel erst nach Nachnamen sortieren und danach gleich nochmal nach Vornamen sortieren. Damit ist die 1. Sortierung aber hinfällig. Die 2. Sortierung würde folgendes liefern.
Adam Müller
Adam Nicht
Berta Nicht
Berta Müller
Chris Müller

Was man machen könnte, ist erst nach Vornamen zu sortieren und im Anschluss nach dem Nachnamen. Mag sein, dass du das gemeint hast. Das dürfte das korrekte Ergebnis liefern. Das würde aber mehr Performance verbrauchen als der obere Quellcode.

Es darf beim 2 mal nur umsortiert werden, wenn der Nachname gleich ist. Genau das macht der obere Quellcode. Warum die Sache also Umständlicher machen. Der Quellcode löst das Problem in meinen Augen am schnellsten und einfachsten.
 
Das geht ziemlich intuitiv. Vergleiche Nachnamen. Wenn Nachnamen gleich, vergleiche Vornamen:

Code:
class X implements Comparable {
  public String vorname;
  public String nachname;

  public int compareTo(Object o) {
    X o2 = (X)o;
    int cmp = this.nachname.compareTo(o2.nachname);
    if (cmp == 0)
      cmp = this.vorname.compareTo(o2.vorname);
    return cmp;
  }
}

Ja so hab ich dass dann auch gelöst, übrigens war das mit Vornamen und Nachnamen nur ein Beispiel.
Ich hab in der Anwendung nur mit zahlen zu tun, aber das Prinzip ist das selbe.
 
Ich habe dich anscheinend wirklich nicht verstanden. So wie ich dich verstehe soll er nach oberen Beispiel erst nach Nachnamen sortieren und danach gleich nochmal nach Vornamen sortieren. Damit ist die 1. Sortierung aber hinfällig. Die 2. Sortierung würde folgendes liefern.
Adam Müller
Adam Nicht
Berta Nicht
Berta Müller
Chris Müller

Was man machen könnte, ist erst nach Vornamen zu sortieren und im Anschluss nach dem Nachnamen. Mag sein, dass du das gemeint hast. Das dürfte das korrekte Ergebnis liefern. Das würde aber mehr Performance verbrauchen als der obere Quellcode.

Es darf beim 2 mal nur umsortiert werden, wenn der Nachname gleich ist. Genau das macht der obere Quellcode. Warum die Sache also Umständlicher machen. Der Quellcode löst das Problem in meinen Augen am schnellsten und einfachsten.

Es gibt vorgefertigte Sorts in den bestehenden Bibliotheken, soweit ich weiß. Und wenn du ein stabiles Verfahren benutzt, ist es egal, nach was du zuerst sortierst, die relative Lage der Elemente zueinander bleibt beim zweiten Durchgang erhalten (vielleicht guckst du mal danach, was stabil bedeutet). Wenn er da den vorgefertigten Sort nehmen würde, hätte er gar keinen Aufwand mehr, irgendwas zu schreiben. War aber nur eine Idee, scheint sich ja mittlerweile erledigt zu haben.
 
Es gibt vorgefertigte Sorts in den bestehenden Bibliotheken, soweit ich weiß. Und wenn du ein stabiles Verfahren benutzt, ist es egal, nach was du zuerst sortierst, die relative Lage der Elemente zueinander bleibt beim zweiten Durchgang erhalten (vielleicht guckst du mal danach, was stabil bedeutet). Wenn er da den vorgefertigten Sort nehmen würde, hätte er gar keinen Aufwand mehr, irgendwas zu schreiben. War aber nur eine Idee, scheint sich ja mittlerweile erledigt zu haben.

Eine Bibliothe macht auch nichts anderes als der obere Quelltext aber sie kann von der Performance her höchstens gleich Schnell sein aber nicht schneller.

Es macht auch bei stabilen Verfahren einen Unterschied wonach du zuerst sortierst. Probier es doch einfach mal selber aus. Es gibt in dem oberen Beispiel genau 2 Möglichkeiten. Entweder die Personen sollen erst nach Nachnamen und wenn dieser gleich ist nach Vornamen sortiert werden oder genau andersrum. Das sind 2 verschiedene Ergebnisse. Ich weiß was ein stabiles Verfahren ist aber es kommt dabei auf die Reinfolge an. Je nach dem welche der beiden 2 Ergebnisse man haben will, muss man die in der einen oder anderen Reinfolge durchjagen. Nimm ein Blatt Papier und spiele es einfach mal durch oder nimm gleich Java und das obere Beispiel. Jage es in beiden möglichen Reinfolgen durch und vergleiche das Ergebnis.

@twoPhases
Ich denke, dass du nicht nach den Namen sortierst, ist eindeutig. Das Beispiel habe ich ins Spiel gebracht, da es anschaulicher ist.
 

Ähnliche Themen

Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh