繁体   English   中英

使用double的绝对值对HashMap进行排序

[英]Sorting HashMap using absolute values of doubles

我正在尝试使用TreeMapSortedMap对类型为<Integer,Double>的哈希图进行排序<Integer,Double>我想对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;
    }
}

谢谢

您能否举一个预期和实际结果的例子?

排序图:{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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM