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不一致。
不知何故,
像这样声明
并将您的
更新根据您的评论使用以下
1 2 3 4 5 6 7 8 |
这是因为您在比较器中与
1 2 3 4 5 6 7 8 9 10 11 |
错误在你的比较器中。
在java中,您无法使用
1 2 3 4 5 6 7 8 9 10 |