java - Map .get()、.containsKey() 方法不起作用

标签 java dictionary

我发现有很多重复的问题,但我无法在我的代码中解决它。

这是我的问题,我有一张 map ,

TreeMap<String,Double> relevantType_Confidence_Map_Aggregated = AggregateTwoTreeMaps.Aggregate2nd3rdYearResult(relevantType_Confidence_Map_Sorted, relevantType_Confidence_Third);
// I think the process of making relevantType_Confidence_Map_Aggregated isn't important in this question.
System.out.println(relevantType_Confidence_Map_Aggregated);
{http://www.w3.org/2002/07/owl#Thing=0.9698529984028573, http://dbpedia.org/ontology/Agent=0.9679645061134368, http://dbpedia.org/ontology/Person=0.9485782773178664}

而且,我有字符串变量。

String className = "http://dbpedia.org/ontology/Agent";

但是,get() 或 containsKey() 方法在我当前的代码中不起作用。

System.out.println(relevantType_Confidence_Map_Aggregated.get(className));
null
System.out.println(relevantType_Confidence_Map_Aggregated.containsKey(className));
false

对于短期解决方案,我迭代条目并获取我想要的值,但我想知道我应该修改什么才能使用内置方法(get, containsKey)

for(Entry<String, Double> e : relevantType_Confidence_Map_Aggregated.entrySet()){
        if(e.getKey().equals(className)){
            System.out.println(e.getValue());
        }
    }
0.9679645061134368  

提前感谢您的友好回复。

<小时/>

补充代码

方法Aggregate2nd3rdYearResult

public static TreeMap<String, Double> Aggregate2nd3rdYearResult(
        TreeMap<String, Double> relevantType_Confidence_Map_Sorted,
        TreeMap<String, Double> relevantType_Confidence_Third) {
    // TODO Auto-generated method stub

    TreeMap<String,Double> relevantType_Confidence_Map_Aggregated = new TreeMap<String,Double>();       

    relevantType_Confidence_Map_Aggregated = average(relevantType_Confidence_Map_Sorted, relevantType_Confidence_Third);

    ValueComparator bvc =  new ValueComparator(relevantType_Confidence_Map_Aggregated);
    TreeMap<String,Double> relevantType_Confidence_Map_Aggregated_Sorted = new TreeMap<String,Double>(bvc);
    relevantType_Confidence_Map_Aggregated_Sorted.putAll(relevantType_Confidence_Map_Aggregated);

    return relevantType_Confidence_Map_Aggregated_Sorted;
}

方法平均值

public static TreeMap<String, Double> average(TreeMap<String, Double> first,
        TreeMap<String, Double> second) {
    // optimization (copy the largest tree map and iterate over the
    // smallest)

    TreeMap<String, Double> result = new TreeMap<String, Double>();
    double threshold = 0.001;

    for (java.util.Map.Entry<String, Double> e : first.entrySet()) {
        Double l = result.get(e.getKey());
        result.put(e.getKey(), e.getValue() + (l == null ? 0 : l));
    }
    for (java.util.Map.Entry<String, Double> e : second.entrySet()) {
        Double l = result.get(e.getKey());
        result.put(e.getKey(), e.getValue() + (l == null ? 0 : l));
    }
    for (java.util.Map.Entry<String, Double> e : result.entrySet()) {
        Double l = result.get(e.getKey());
        result.put(e.getKey(), l/2);
    }


    Iterator it = result.entrySet().iterator();
    while (it.hasNext()){
    java.util.Map.Entry<String, Double> item = (java.util.Map.Entry<String, Double>) it.next();
       if(item.getValue() < threshold){
           it.remove();
       }

    }

    return result;
}

值比较器类

import java.util.Comparator;
import java.util.Map;

public class ValueComparator implements Comparator<String> {

    Map<String, Double> base;
    public ValueComparator(Map<String, Double> base) {
        this.base = base;
    }

    // Note: this comparator imposes orderings that are inconsistent with equals.    
    public int compare(String a, String b) {
        if (base.get(a) >= base.get(b)) {
            return -1;
        } else {
            return 1;
        } // returning 0 would merge keys
    }

}

最佳答案

TreeMap 使用的 ValueComparator 不正确。它不仅与 equals 不一致,而且还违反了对于所有 x 和 y 的 sgn(compare(x, y)) == -sgn(compare(y, x)) 的要求。具有此类比较器的 TreeMap 可能会出现错误行为。

可能的解决方案是当 base.get(a) == base.get(b) 时使用 a.compareTo(b) (因此即使具有相同值的键有一些定义的顺序):

public int compare(String a, String b) {
    double diff = base.get(a) - base.get(b);
    if (diff > 0) {
        return -1;
    } else if (diff < 0) {
        return 1;
    } else {
        return a.compareTo(b);
    }
}

关于java - Map .get()、.containsKey() 方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34127274/

相关文章:

arrays - 字典保存错误 "SwiftValue encodeWithCoder:]: unrecognized selector sent to instance"

javascript - 如何在没有 forEach 的情况下迭代 Javascript Map?

java - Netty(4.0.4)版本压缩/解压字符串报错

java - 在 Spring 中创建可重用的 GUI 组件

swift - 如何处理哈希冲突?

python - 在python中,我想根据字典值的字典对字典进行排序

java - 如何在Java中根据公共(public)属性合并两个排序的对象列表

java - 如何在 Selenium Web 驱动程序中单击下一个 span 元素

java - 如何在Libgdx中制作类似Flappy Bird的动画?

ios - 歧义使用 'subscript' - NSMutableDictionary