【问题标题】:Sorting Map<ArrayList, List<Entity>> by Key - ArrayList is set of Dates按键排序 Map<ArrayList, List<Entity>> - ArrayList 是一组日期
【发布时间】:2012-04-23 18:01:32
【问题描述】:

下面是比较器的代码,但是在 SortedMap.putAll() 之后,与源 Map 相比,SortedMap 的 Map Entries 数量较少。

有人可以帮忙吗?

Comparator<ArrayList> arrayListComparer = new Comparator<ArrayList>() {
                @Override
                public int compare(ArrayList arrA, ArrayList arrB) {
                    DateFormat formatter = new SimpleDateFormat("MMM-yyyy");
                    Date dateA = new Date();
                    Date dateB = new Date();
                    try {
                        dateA = formatter.parse(arrA.get(0).toString());
                        dateB = formatter.parse(arrB.get(0).toString());
                    } catch (ParseException ex) {
                        Logger.getLogger(ValueComparator.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    if (dateA.before(dateB)) {
                        return 0;
                    } else if (dateA.after(dateB)) {
                        return 1;
                    } else {
                        return -1;
                    }
                }
            };
SortedMap sorted_map = new TreeMap(arrayListComparer);
sorted_map.putAll(map);

【问题讨论】:

  • 运行时没有异常?
  • 无论你的比较器逻辑是什么,这都不应该发生。你可能看错了。
  • 你能给出你正在测试的数据集吗?

标签: java collections comparator sortedmap


【解决方案1】:

当您使用SortedMapSortedSet 时,您的Comparator 应该仅在两个对象相等时返回0。因为它按此标准处理密钥相等性。

查看自然排序:http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html

例如,如果添加两个键 a 和 b 使得 (!a.equals(b) && a.compareTo(b) == 0) 到不使用显式的排序集 比较器,第二个添加操作返回 false(以及 排序集不会增加)因为 a 和 b 等价于 排序集的视角。

【讨论】:

  • 谢谢@Eugene。完美运行。
【解决方案2】:

如果您能向我们展示您的地图示例会有所帮助,但无论如何我都会冒险回答。

可能导致这种情况的原因是您的 Map 中有条目,您的 compare 方法(在您的比较器中)返回 0,这意味着键相等。如果它们相等,则它是相同的键...并且您不能在 Map 中有重复的键。

你能看出问题吗?

我举个小例子:

public static void main(String[] args) {
    Map<Bla, String> map = new HashMap<Bla, String>();
    map.put(new Bla(1,1), "bla1");
    map.put(new Bla(1,2), "bla2");
    map.put(new Bla(1,3), "bla3");

    System.out.println(map.size());

    TreeMap<Bla, String> treeMap = new TreeMap<Bla,String>(new Comparator<Bla>() {
        @Override
        public int compare(Bla bla, Bla bla1) {
            return new Integer(bla.a).compareTo(bla1.a);
        }
    });

    treeMap.putAll(map);

    System.out.println(treeMap.size());

}

private static class Bla{

    private Bla(int a, int b) {
        this.a = a;
        this.b = b;
    }

    public int a;
    public int b;
}

这将输出

3 1

因为我的比较器说所有三个键都是相同的(仅比较“a”值)。

【讨论】:

  • 嗨,这只是平等的问题。 :) 非常感谢您尝试提供帮助。我的错,试图整夜编码;)
猜你喜欢
  • 1970-01-01
  • 2012-09-15
  • 2023-03-28
  • 2015-11-29
  • 1970-01-01
  • 2017-12-16
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多