Java:为什么我在输出中得到null?

时间:2011-12-08 17:59:36

标签: java

public class A{

   TreeMap<String, Double> sortedPairList;
   HashMap<String, Double> PairList = new HashMap<String, Double>();

   public static void main(String[] args) {

   A p = new A();

    p.PairList.put("a00", 0.3920948902348);
    p.PairList.put("a01", 0.4920948902348);
    p.PairList.put("a02", 0.3420948902348);
    p.PairList.put("a03", 0.5920948902348);
    p.PairList.put("a04", 0.6720948902348);
    p.PairList.put("a05", 0.3940948902348);
    p.PairList.put("a06", 0.3920948902348);
    p.PairList.put("a07", 0.9920948902348);
    p.PairList.put("a08", 0.6920948902348);
    p.PairList.put("a09", 0.7920948902348);
    p.PairList.put("a10", 0.8820948902348);
    p.PairList.put("a11", 0.1220948902348);
    p.PairList.put("a12", 0.1920948902348);
    p.PairList.put("a13", 0.4520948902348);
    p.PairList.put("a14", 0.3434948902348);
    p.PairList.put("a15", 0.5690948902348);
    p.PairList.put("a16", 0.5920948902348);
    p.PairList.put("a17", 0.8920948902348);
    p.PairList.put("a18", 0.920948902348);
    p.PairList.put("a19", 0.9820948902348);
    p.PairList.put("a20", 0.1920948902348);
    p.PairList.put("a21", 0.5920948902348);
    p.PairList.put("a22", 0.3920948902348);
    p.PairList.put("a23", 0.3920948902348);

    p.sortPairList(p.PairList) ;

    for(String s : p.sortedPairList.keySet() ){
         System.out.println("key:: value: " + s + "  ::"+p.sortedPairList.get(s));
    }

}//end of main


public void sortPairList(HashMap<String, Double> pairlist) {
    ValueComparator comp = new ValueComparator(pairlist);

    sortedPairList = new TreeMap<String, Double>(comp);

    sortedPairList.putAll(pairlist);


}// end of sortedPredicatePairList

class ValueComparator implements Comparator<Object> {

    Map<String, Double> temp;

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

    public int compare(Object p1, Object p2) {

        if ((Double) temp.get(p1) < (Double) temp.get(p2)) {
            return 1;
        } else if ((Double) temp.get(p1) == (Double) temp.get(p2)) {
            return 0;
        } else {
            return -1;
        }

    }
}// end of class ValueComparator
}//end of classA

*我得到的输出如下,为什么我在重复的值中得到空值: *

key :: value:a07 :: 0.9920948902348

key :: value:a19 :: 0.9820948902348

key :: value:a18 :: 0.920948902348

key :: value:a17 :: 0.8920948902348

key :: value:a10 :: 0.8820948902348

key :: value:a09 :: 0.7920948902348

key :: value:a08 :: 0.6920948902348

key :: value:a04 :: 0.6720948902348

key :: value:a03 :: 0.5920948902348

key :: value:a21 :: null

key :: value:a16 :: null

key :: value:a15 :: 0.5690948902348

key :: value:a01 :: 0.4920948902348

key :: value:a13 :: 0.4520948902348

key :: value:a05 :: 0.3940948902348

key :: value:a06 :: 0.3920948902348

key :: value:a23 :: 0.3920948902348

key :: value:a22 :: 0.3920948902348

key :: value:a00 :: null

key :: value:a14 :: 0.3434948902348

key :: value:a02 :: 0.3420948902348

key :: value:a12 :: 0.1920948902348

key :: value:a20 :: null

key :: value:a11 :: 0.1220948902348

4 个答案:

答案 0 :(得分:3)

来自Tree Map API

请注意,如果此有序映射要正确实现Map接口,则由有序映射维护的排序(无论是否提供显式比较器)必须与equals一致。 (请参阅Comparable或Comparator以获得与equals一致的精确定义。)这是因为Map接口是根据equals操作定义的,但是map使用compareTo(或compare)方法执行所有键比较,因此有两个键从排序映射的角度来看,这种方法被认为是相等的。

你的ValueComparator肯定与equals不一致。

不知何故,p.sortedPairList.keySet()包含根据您的“ValueComparator”“等于”的键,但是您为重复键获得了null

答案 1 :(得分:2)

像这样声明PairList

HashMap<String, Double> PairList = new HashMap<String, Double>();

将您的ValueComparator#compare方法更改为:

public int compare(Object p1, Object p2) {
   return temp.get(p1).compareTo(temp.get(p2));
}

更新根据您的评论,使用compare方法按升序获取所有24个元素:

public int compare(String p1, String p2) {
    if (temp.get(p1).doubleValue() < temp.get(p2).doubleValue())
        return 1;
    else if (temp.get(p1).doubleValue() == temp.get(p2).doubleValue())
        return p1.compareTo(p2);
    else
        return -1;
}

答案 2 :(得分:0)

该错误存在于您的比较器中。

在java中,您无法使用==运算符比较对象。这个操作符可以满足你的期望。因此,要比较您在地图中保存的双打值,您必须调用doubleValue()。这是我的比较器版本正常工作。

    public int compare(Object p1, Object p2) {

        if (temp.get(p1).doubleValue() < temp.get(p2).doubleValue()) {
            return 1;
        } else if (temp.get(p1).doubleValue() == temp.get(p2).doubleValue()) {
            return 0;
        } else {
            return -1;
        }           
    }

答案 3 :(得分:0)

这是因为您在比较器中与==符号进行比较。用equals()方法替换它,它应该工作:

 public int compare(Object p1, Object p2) {

            if ((Double) temp.get(p1) < (Double) temp.get(p2)) {
                return 1;
            } else if (((Double) temp.get(p1)).equals((Double) temp.get(p2))) {
                return 0;
            } else {
                return -1;
            }

        }