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

Java: Why am I getting null in the output?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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


来自Tree Map API:

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

你的ValueComparator肯定与equals不一致。

不知何故,p.sortedPairList.keySet()包含根据"ValueComparator""等于"的键,但是对于重复键,你得到null


像这样声明PairList

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

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

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

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

1
2
3
4
5
6
7
8
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;
}


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

1
2
3
4
5
6
7
8
9
10
11
 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;
            }

        }


错误在你的比较器中。

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

1
2
3
4
5
6
7
8
9
10
    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;
        }          
    }