2012-12-12 87 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. –