PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : java: Inhalt von Vektoren sortieren


Satariel
2008-06-08, 00:28:09
Folgendes:

Es geht um einen Vektor der mit Objekten gefüllt ist, jedes dieser Objekte hat ein paar Integerwerte. Nun möchte ich die Objekte im Vektor nach den Integerwerten sortieren.

Oder etwas konkreter:
Wir haben ein Kartenspiel.
Das Objekt ist die klasse Karten, mit Integerwerten für Wert und Farbe.
Der Vektor ist der Kartenstapel.

Nun möchte ich die Karten im Stapel in Reihenfolge ihrer Werte sortieren. Was tun?

die Idee ist folgende:
In die Karte-Klassendeklaration schreiben public abstract class Karte implements Comparable<Karte>

dann in der Stapel-Klasse:

Collections.sort(Stapel);
Collections.reverse(Stapel);

aber dieser Sortieralgorithmus weiß doch gar nicht dass er nach dem Wert sortieren muss, er könnte ja genausogut nach Farbe sortieren.
Mit einem Array oder einer Liste ginge das recht einfach, aber für einen Vektor sieht Java irgendwie keine Sortierfunktion vor.

Bin für Vorschläge echt dankbar.

Monger
2008-06-08, 00:33:51
Mal abgesehen davon dass Vector eigentlich nicht so hip ist, und du stattdessen ne ArrayList nehmen solltest:


Dein Gedankengang ist schon völlig richtig. Vector implementiert genauso wie ArrayList oder Array das List Interface, und kann dementsprechend mit Collections.sort() sortiert werden. Es kommt alles nur auf die richtige Implementierung des Comparable Interfaces deiner Klasse an.

Was ist also das konkrete Problem? Weißt du nicht, wie man Comparable richtig implementiert?

Das Comparable Interface verlangt eine compareTo Methode. Die kann sinngemäß etwa so aussehen:


public int compareTo(Karte k){

int ergebnis = this.Farbe - k.Farbe;
if (ergebnis != 0) return ergebnis;
return this.Wert - k.Wert;
}

So kannst du auch komplexe Sortiervorgänge implementieren, die vorrangig erst auf den einen, und dann nachrangig auf einen anderen Wert schauen.

Satariel
2008-06-08, 00:46:03
ahh, die CompareTo Methode hatte ich bis jetzt nicht wirklich verstanden.

Aber die Erklärung war gut, ich denke ich habs nun. :)

Danke!

DocEW
2008-06-09, 09:54:02
Ein bisschen mehr Flexibilität hast du, wenn du die sort-Methode benutzt, die zusätzlich noch einen Comparator verwendet: public static void sort(List list, Comparator c)Kann ja sein, dass die Liste auf verschiedene Weisen sortiert werden soll.

Pinoccio
2008-06-09, 13:51:43
Ein bisschen mehr Flexibilität hast du, wenn du die sort-Methode benutzt, die zusätzlich noch einen Comparator verwendet: public static void sort(List list, Comparator c)Kann ja sein, dass die Liste auf verschiedene Weisen sortiert werden soll.Ein bißchen mehr ist gut! ;-)

Je nach Anwendung ist das eine oder das andere sinnvoller.
Spielkarten sind wohl eher ein Fall für Comparator; schlägt (sticht? übertrumpft?) doch zum Beispiel beim Skat im Null die Dame die gleichfarbige 10, während es beim Farbspiel genau andersherum ist.
Implementiert man zum Beispiel (unnötigerweise) große Zahlen, so existiert in der Regel nur eine Ordnung, die natural ordering und comparable ist die bessere Wahl.


mfg