【问题标题】:TreeMap strangley workingTreeMap 扼杀工作
【发布时间】:2014-06-25 09:35:53
【问题描述】:

我有一个 HashMap 匹配一个双精度字符串,我尝试在对这些值进行一些修改后使用 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;
        } 
    }
}

如果您对此有任何见解,请不吝赐教。

【问题讨论】:

  • 什么样的修改?如果该比较器变得不一致或不完整,TreeMap 将停止工作。
  • 我尝试了equals方法,大约一半的条目消失了......修改只是将值除以一个整数。我在示例中采用的值是该修改的结果

标签: java null treemap


【解决方案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" 替换,因为它们被比较器视为相等。

此外,正如其他答案中所建议的,您需要比较 Double 值做 base.get(a).equals(base.get(b))

【讨论】:

  • +1 要解决这个问题,如果值相等,您也可以比较键(将 return 0 更改为 return a.compareTo(b)
  • 非常感谢,您的解决方案似乎解决了我的问题。我对 Comparator 类的使用一无所知,所以它真的很有帮助
  • 这可能无法解决您比较方法的核心问题。而不是使用 == 你应该在比较方法中使用 equals。
【解决方案2】:
if(base.get(a)==base.get(b))

这将比较 Double-objects 的实例而不是值。尝试将其更改为

if(base.get(a).doubleValue()==base.get(b).doubleValue())

【讨论】:

    【解决方案3】:

    如下更改您的比较方法。

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

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

    【讨论】:

    • 这似乎使大部分条目消失了。
    • 您的比较器实现说只有非重复值。这就是条目缺少重复值的原因,因为它在将条目从哈希图添加到树图时返回 0。
    • 好吧。我只是复制了一个比较器的实现。我对这门课几乎一无所知。也许我应该更多地了解我正在使用的东西:p
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2021-01-04
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    相关资源
    最近更新 更多