TreeMap strangley工作

时间:2014-06-25 09:35:54

标签: java null treemap

我有一个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;
        } 
    }
}

如果您对此有任何疑问,请赐教。

3 个答案:

答案 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;
    } 
}

这是您的代码失败的主要原因