2010-11-23 16 views
4

說我有喜歡一個對象可以有多個比較方法來根據不同的值進行排序嗎?

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

樂曲對象是否有可能有比較多的是,根據收集使用的方法,排序的特定字段?這個對象已經有一個基於藝術家和標題值的排序比較方法,我希望能夠根據排名進行排序。

我目前的項目要求我們對歌曲的歌詞進行搜索並返回一個高到低的匹配列表。我想使用PriorityQueue來根據等級值來保存比賽。

通常我會簡單地創建另一個對象來保存歌曲和等級,但是這個項目不僅插入教授提供的GUI界面,它需要在Song []數組中傳遞任何結果,而是打印出前十個值爲排名,藝術家,標題。

我可以使用toArray()來轉換隊列,但如果我使用它來存儲Song對象以外的任何東西,它將拋出ArrayStoreException。

那麼這是可能的,還是我必須修改現有的比較方法按整數值排序?

回答

4

大多數有序集合都有一個構造函數,它將Comparator作爲參數。在Song類中定義幾個靜態比較,然後定義的東西如下:

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

有實用工具類(例如,番石榴Ordering),可以幫助你從基礎建立其他比較。

4

compareTo方法的Comparable接口通常會提供默認的比較,如果你想提供另一個你應該寫的Comparator的對象。

1

而是宋實現可比的,通過自定義的比較到您選擇的集合。

請參閱Object Ordering瞭解更多詳情。

+0

這是我做的,就像插入一個項目成一個PriorityQueue魅力 – Jason 2010-12-02 05:36:13

2

您可以使用構造函數PriorityQueue(int, Comparator<? super E>)來使用不同的順序。

除排序外,是否有使用PriorityQueue的原因? PriorityQueue不僅效率低下,如果您不需要在每個新元素之後對它進行排序,但也不能用於以不同方式進行排序。您需要爲每個所需的排序需要不同的PriorityQueue

使用List可能是足夠的和將允許您使用不同的Comparator只要你喜歡排序:Collections.sort(List<T> list, Comparator<? super T>)

+1

在O(完成日誌N)時間。 Java使用修改的合併排序,它具有O(N日誌N)運行時。即使我命令插入Arraylist,添加時間將是O(N)。當我能得到它時,我會記錄下任何事情。 – Jason 2010-12-02 05:39:04

相關問題