1

我正在尝试<Integer,Double>使用 aTreeMap和 a对类型的哈希图进行排序SortedMap我想对 s 的绝对值进行排序,Double但我也想保留符号值(因此不存储为 unsigned 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;
    }
}

谢谢

4

1 回答 1

1

你能举一个预期和实际结果的例子吗?

Sorted map: {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。

于 2012-09-12T01:23:52.033 回答