【问题标题】:TreeMap<String, Integer> object's get method return null valueTreeMap<String, Integer> 对象的 get 方法返回空值
【发布时间】:2012-11-30 08:07:21
【问题描述】:
import java.util.*;

public class Sort {

    static class ValueComparator implements Comparator<String> {

        Map<String, Integer> base;

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

        @Override
        public int compare(String a, String b) {
            if (base.get(a) >= base.get(b)) {
                return 1;
            } else {
                return -1;
            }
        }
    }

    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        ValueComparator vc = new ValueComparator(map);
        TreeMap<String, Integer> sorted = new TreeMap<String, Integer>(vc);
        map.put("A", 1);
        map.put("B", 2);
        sorted.putAll(map);
        for (String key : sorted.keySet()) {
            System.out.println(key + " : " + sorted.get(key)); // why null values here?
        }
        System.out.println(sorted.values()); // But we do have non-null values here!
    }
}

输出:

A : null
B : null
[1, 2]
BUILD SUCCESSFUL (total time: 0 seconds)

我想知道为什么我们在第一个注释行得到空值,而我们确实有非空值,如第二个注释行所示。

编辑:@null 的版本似乎不起作用。我已将代码更改如下:

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

它似乎有效,但我不确定。

【问题讨论】:

    标签: java hashmap key-value treemap


    【解决方案1】:

    即使你的比较器肯定坏了,如果你把它改成这样,程序也能工作

    for (Map.Entry e : sorted.entrySet()) {
        System.out.println(e.getKey() + " : " + e.getValue());
    }
    

    【讨论】:

      【解决方案2】:

      我的猜测是你的ValueComparator.compare()方法永远不会返回0,表示相等,导致Map.get()方法找不到匹配项。

      【讨论】:

        【解决方案3】:

        以这种方式更改您的比较

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

        【讨论】:

        • 嗯.. 我宁愿 - return base.get(a) - base.get(b);.
        • 虽然看起来很简单,但在比较器函数中使用 a-b 习语自 qsort() 之类的日子以来一直存在(甚至可能更长),但它伴随着它一个重要的缺点:如果发生溢出,结果会不正确;例如,考虑如果base.get(a) 返回Integer.MIN_VALUE 并且base.get(b) 为正会发生什么。
        • 等等,你的代码有一个键合并问题。除非您知道,否则请尝试一下。
        • 你可以这样做 return base.get(a).compareTo(base.get(b));并让 Integer 类处理它。
        猜你喜欢
        • 1970-01-01
        • 2013-01-16
        • 1970-01-01
        • 1970-01-01
        • 2019-01-18
        • 1970-01-01
        • 1970-01-01
        • 2021-02-03
        • 1970-01-01
        相关资源
        最近更新 更多