我有一个HashMap匹配一个带有double的String,我尝试使用TreeMap对值进行排序后对值进行一些修改。
它可以工作,我可以打印整个树,但是当我尝试通过它的键访问特定值时,它会在大约一半的时间内返回null,总是在相同的键上,即使它们的值是与其他人没有什么不同。 同样,重试删除密钥也不起作用。
这是我的问题的一个例子。它不是我的代码的一部分,但它重现了同样的问题:
Map<String, Double> freq = new HashMap<String, Double>();
ValueComparator classif = new ValueComparator(freq);
TreeMap<String, Double> sorted_freq = new TreeMap<String, Double>(classif);
freq.put("bara" , 0.1142204454597373);
freq.put("religieux" , 0.05711022272986865);
freq.put("alliance" , 0.05711022272986865);
freq.put("ethnique" , 0.05711022272986865);
freq.put("officiers" , 0.1142204454597373);
freq.put("ascendants" , 0.05711022272986865);
freq.put("correspondait" , 0.05711022272986865);
freq.put("toko" , 0.05711022272986865);
freq.put("evenement" , 0.1142204454597373);
freq.put("certainement" , 0.05711022272986865);
freq.put("chance" , 0.05711022272986865);
sorted_freq.putAll(freq);
for(String key:freq.keySet()){
System.out.println(key+" : "+freq.get(key));
}
System.out.println("------------------------------------------------------------------");
for(String key:sorted_freq.keySet()){
System.out.println(key+" : "+sorted_freq.get(key));
}
这是我用来构建TreeMap的比较器:
class ValueComparator implements Comparator<String> {
Map<String, Double> base;
public ValueComparator(Map<String, Double> freq) {
this.base = freq;
}
public int compare(String a, String b) {
if (base.get(a) > base.get(b)) {
return -1;
}else if(base.get(a)==base.get(b)){
return 0;
} else {
return 1;
}
}
}
如果您对此有任何疑问,请赐教。
答案 0 :(得分:1)
if(base.get(a)==base.get(b))
这会比较Double对象的实例而不是值。尝试将其更改为
if(base.get(a).doubleValue()==base.get(b).doubleValue())
答案 1 :(得分:1)
您的问题是,如果原始地图的两个条目具有相同的值,则只会保留freq
中插入的最后一个条目。因此,freq
中已替换的密钥将从树形图中删除。
示例:
freq.put("bara" , 0.1142204454597373);
freq.put("religieux" , 0.05711022272986865);
freq.put("alliance" , 0.05711022272986865);
然后freq.get("religieux")
返回null
,因为它与"alliance"
具有相同的值,之后插入了"alliance"
,"religieux"
已被{"alliance"
取代1}}因为比较器认为它们是相等的。
此外,正如其他答案中所建议的那样,您需要比较正在Double
base.get(a).equals(base.get(b))
值
答案 2 :(得分:0)
更改比较方法如下。
public int compare(String a, String b) {
if (base.get(a) > base.get(b)) {
return -1;
}else if(base.get(a).equals(base.get(b))){
return 0;
} else {
return 1;
}
}
这是您的代码失败的主要原因