我正在尝试使用<Integer,Double>
和TreeMap
对SortedMap
类型的哈希图进行排序我想对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;
}
}
由于
答案 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。