使用双精度的绝对值对HashMap进行排序

时间:2012-09-12 01:16:16

标签: java sorting hashmap

我正在尝试使用<Integer,Double>TreeMapSortedMap类型的哈希图进行排序我想对Double的绝对值进行排序,但我也是想要保留符号值(因此不存储为无符号Double)。

下面是我正在使用的代码,但是我没有得到我期望的值,可能是由于使用了hashcode(),有人可以指出如何解决这个问题吗?

Map<Integer,Double> termWeights = new HashMap<Integer,Double>();    
SortedMap sortedData = new TreeMap(new ValueComparer(termWeights));
System.out.println(termWeights);
sortedData.putAll(termWeights);
System.out.println(sortedData);

class ValueComparer implements Comparator {
    private Map _data = null;

    public ValueComparer(Map data) {
        super();
        _data = data;
    }

    public int compare(Object o1, Object o2) {
        Double e1 = Math.abs((Double) _data.get(o1));
        Double e2 = Math.abs((Double) _data.get(o2));
        int compare = e2.compareTo(e1);
        if (compare == 0) {
            Integer a = o1.hashCode();
            Integer b = o2.hashCode();
            return b.compareTo(a);
        }
        return compare;
    }
}

由于

1 个答案:

答案 0 :(得分:1)

  

您能举例说明预期结果和实际结果吗?

     

分类地图:{17 = 1.644955871228835,0 = -1.029545248153297,10 = -5.291765636407169E-4,9 = -3.331976978545177E-4,1 = -2.7105555587851366E-4,2 = -2.7105555587851366E-4,7 = -2.0897436261984377E-4,8 = -1.305197184270594E-5,3 = 0.0,4 = 0.0,5 = 0.0,6 = 0.0,11 = 0.0,12 = 0.0,13 = 0.0,14 = 0.0,15 = 0.0, 16 = 0.0,18 = 0.0,19 = 0.0,20 = 0.0,21 = 0.0,22 = 0.0}

那么问题是什么?

看起来正确地从最大到最小排序。

但是我会避免在抢夺式辅助比较器中使用hashCode,因为你需要它永远不会为不同的输入返回相同的值。在这种情况下,它可以工作,因为你在Integer上调用它,其中hashCode只返回相同的int。但是如果你在地图中使用了Long或String键,它就会发生碰撞。直接比较两个键。

最后,在开始使用比较器后,不得更改重量。这将导致不一致的TreeMap。