Java 如何按(日期)值对树映射进行排序?

Java 如何按(日期)值对树映射进行排序?,java,treemap,Java,Treemap,可能重复: 我有一个类型的树形图。我想按日期排序(最新的第一个),我不能用它们作为键,因为我不能保证它们是唯一的。有什么方法可以做到这一点吗?你不能直接做,你可以做的是将收藏的内容复制到新的内容中,然后对其进行排序,例如: List<Map.EntrySet<String, Date>> copy = new ArrayList<Map.EntrySet<String, Date>>(treeMap.entrySet()); Collectio

可能重复:


我有一个
类型的树形图。我想按日期排序(最新的第一个),我不能用它们作为键,因为我不能保证它们是唯一的。有什么方法可以做到这一点吗?

你不能直接做,你可以做的是将收藏的内容复制到新的内容中,然后对其进行排序,例如:

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
  }
}
List copy=newarraylist(treeMap.entrySet());
Collections.sort(复制,新建CustomComparator());
类CustomComparator实现Comparator{
公共整数比较(映射项e1、映射项e2){
//比较你的约会
}
}

当然,此集合不会与原始集合同步,因此每次修改原始
TreeSet
时都必须重新进行此操作。

实际上,如果确实需要,可以在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);

请注意,两个条目具有相同的键,并且输出按您想要的日期排序。

@Nambari,当值不唯一时,该问题的答案不起作用。@Louis,当值不唯一时,为什么不起作用?@LouisWasserman:好的。事实上,我一直在寻找你的答案,但我的思想链接做同样的工作。我正在删除它。@AleksanderBlomskøld的链接解决方案对于重复的值也会失败。查看注释。
Map
根据定义,一个键不能有两个值。我遗漏了什么?测试中使用的比较器允许它。这一切都取决于比较器和你的愿望,如果需要,你可以让树映射认为2小于1。哦,你的比较器永远不会返回0。所以你可以把东西放到这个映射中并对它进行迭代,但不能从中得到任何东西,amirite?当然get()没有意义。一次获取无法获取两个值基于今天的日期进行计算和排序吗?像生日的事?
{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}