[英]Sorting HashMap using absolute values of doubles
我正在尝试使用TreeMap
和SortedMap
对类型为<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.