2012-12-12 91 views
-3

可能重複:
TreeMap sort by value
Map that could be iterated in the order of values如何按(日期)值排序TreeMap?

<String, Date>類型的一個TreeMap。我想按日期排序(最近的第一個),我不能將它們用作鍵,因爲我不能保證它們是唯一的。有沒有辦法做到這一點?

+0

@Nambari,當值不唯一時,該問題的答案不起作用。 –

+0

@Louis,當值不唯一時,爲什麼它不能工作? – ignis

+0

@LouisWasserman:好的。其實我一直在尋找你的答案,但是我認爲我有同樣的工作。我正在刪除它。 – kosa

回答

5

你不能直接這樣做,你可以做的是集合的內容複製到一個新的,然後排序,如:

List<Map.EntrySet<String, Date>> copy = new ArrayList<Map.EntrySet<String, Date>>(treeMap.entrySet()); 
Collections.sort(copy, new CustomComparator()); 

class CustomComparator implements Comparator<Map.Entry<String,Date>> { 
    public int compareTo(Map.Entry<String,Date> e1, Map.Entry<String,Date> e2) { 
    // compare your dates 
    } 
} 

當然這個集合不會與原始的同步,所以您必須每次修改原始的TreeSet時再次執行此操作。

+0

是基於當今日期的comaprsion和排序?像生日那樣? – Skynet

0

其實你可以在TreeMap中重複鍵,如果你真的想

Map<Date, String> map = new TreeMap<Date, String>(new Comparator<Date>() { 
     @Override 
     public int compare(Date d1, Date d2) { 
      return d1.after(d2) ? 1 : -1; 
     } 
    }); 
    Date d1 = new Date(-100000000000L); 
    Date d2 = new Date(100000000000L); 
    map.put(d2, "s1"); 
    map.put(d1, "s2"); 
    map.put(d1, "s3"); 
    System.out.println(map); 

輸出

{Mon Oct 31 16:13:20 EET 1966=s3, Mon Oct 31 16:13:20 EET 1966=s2, Sat Mar 03 11:46:40 EET 1973=s1} 

注意2項具有相同的密鑰,並且輸出由日期爲你想整理

+0

根據定義,「Map」不能有一個鍵的兩個值。我錯過了什麼? –

+0

測試中使用的比較器允許它。所有這些都取決於比較器和你的願望,如果需要的話,可以使TreeMap認爲2小於1。 –

+0

哦,你的比較器永遠不會返回0. –