【发布时间】:2012-09-12 01:16:16
【问题描述】:
我正在尝试使用TreeMap 和SortedMap 对<Integer,Double> 类型的哈希图进行排序我想对Doubles 的绝对值进行排序,但我也想保留符号值(因此不存储为未签名的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;
}
}
谢谢
【问题讨论】:
-
hashCode 部分应该做什么?如果绝对值相等,为什么不直接返回 0?
-
返回
0的Map中有重复值导致信息丢失。 -
比较器适用于唯一值,当有重复值(在我的情况下)时,我需要进行二次比较,但不再考虑绝对值(我需要) .我想知道如何将绝对值包含在
compareTO -
如果它有效,我就不会发布了。如果不需要双精度值的绝对值,这个比较器是正确的。但是,正如我提到的,当出现重复并且
compare == 0二次比较无法正确排序时。我知道为什么,因为hashCode()忽略了双精度数的绝对值。 -
为什么?他们是最大的两个。下一个要小四个数量级。我觉得不错。