2010-11-23 7 views
4

Sagen, ich habe ein Lied Objekt wieKann ein Objekt mehrere Compare-Methoden für die Bestellung basierend auf verschiedenen Werten haben?

public Song(){ 
    String artist, title; 
    StringBuilder lyrics; 
    int rank; 
} 

Ist es möglich, mehr Methoden zu vergleichen haben, die in Abhängigkeit von der Sammlung, Sortierung nach einem bestimmten Feld verwendet? Dieses Objekt hat bereits eine Vergleichsmethode zum Ordnen basierend auf den Künstler- und Titelwerten, und ich würde gerne in der Lage sein, basierend auf dem Rang zu ordnen.

Mein aktuelles Projekt erfordert, dass wir eine Suche nach den Songtexten durchführen und eine Liste mit hohen bis niedrigen Übereinstimmungen erstellen. Ich möchte eine PriorityQueue verwenden, um die Matches basierend auf dem Rangwert zu halten.

Normalerweise würde ich einfach ein anderes Objekt erstellen, um den Song und den Rang zu halten, aber dieses Projekt wird nicht nur in eine vom Professor gelieferte GUI-Schnittstelle gesteckt, die irgendwelche Ergebnisse in einem Song [] -Array erfordert, sondern ausgibt die ersten zehn Werte als Rang, Künstler, Titel.

Ich kann toArray() verwenden, um die Warteschlange zu konvertieren, aber wenn ich es verwende, um etwas anderes als Song-Objekte zu speichern, wird es eine ArrayStoreException werfen.

So ist das möglich, oder muss ich die vorhandene Vergleichsmethode ändern, um nach ganzzahligen Werten zu sortieren?

Antwort

4

Die meisten geordneten Sammlungen haben einen Konstruktor, der ein Comparator als Argument verwendet. Definieren Sie ein paar statischen Komparatoren in Ihrer Song Klasse und dann Dinge wie folgt definieren:

Set<Song> allSongs = new TreeSet<Song>(Song.BY_TITLE); 
PriorityQueue<Song> rankedSongs = new PriorityQueue<Song>(10, Song.BY_RANK); 

Es gibt Utility-Klassen (zum Beispiel Guava Ordering), die Sie von den Grundlagen aufbauen andere Komparatoren helfen können.

4

Die compareTo Methode der Comparable Schnittstelle bietet in der Regel den Standardvergleich, wenn Sie einen anderen liefern möchten, sollten Sie ein Comparator Objekt schreiben.

1

Statt Vergleichbar in Lied Implementierung eines benutzerdefinierten Komparator zu Ihrer Sammlung der Wahl passieren.

Weitere Informationen finden Sie unter Object Ordering.

+0

das ist, was ich tat, wirkt wie ein Zauber – Jason

2

Sie könnten den Konstruktor PriorityQueue(int, Comparator<? super E>) verwenden, um eine andere Reihenfolge zu verwenden.

Gibt es einen Grund für die Verwendung eines PriorityQueue abgesehen von der Sortierung? PriorityQueue ist nicht nur ineffizient, wenn Sie nicht nach jedem neuen Element sortiert werden müssen, sondern auch nicht auf verschiedene Arten sortieren können. Sie würden eine andere PriorityQueue für jede gewünschte Sortierung benötigen.

ein List Mit ausreichend sein könnte und Ihnen erlauben würde, mit einer anderen Comparator zu sortieren, wann immer Sie mögen: Collections.sort(List<T> list, Comparator<? super T>)

+1

ein Element in ein Priorityqueue Einfügen in O getan (log N) Zeit. Java verwendet eine modifizierte Zusammenführungssortierung, die eine O (N log N) -Laufzeit hat.Selbst wenn ich einen Arraylist beim Einfügen bestellen würde, wäre die Zeit O (N). Ich werde Log-Zeit für alles nehmen, wenn ich es bekommen kann. – Jason

Verwandte Themen