java treeMap 排序后 get不到value

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java treeMap 排序后 get不到value相关的知识,希望对你有一定的参考价值。

代码如下

import java.util.*;

public class main

public static void main(String[] args)

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

ValueComparator bvc = new ValueComparator(map);

TreeMap<String,Double> sorted_map = new TreeMap<String,Double>(bvc);

map.put("A",99.5);

map.put("B",67.4);

map.put("C",67.4);

map.put("D",67.3);

System.out.println("unsorted map: "+map);

sorted_map.putAll(map);

System.out.println("results: "+sorted_map);

Iterator it = sorted_map.keySet().iterator();

while (it.hasNext())

//it.next()得到的是key,tm.get(key)得到obj

System.out.println(sorted_map.get(it.next()));







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





打印出来的时
unsorted map: D=67.3, A=99.5, B=67.4, C=67.4

results: A=99.5, C=67.4, B=67.4, D=67.3
但是遍历sort_map却返回null

你想按照map的value进行排序,首先你的compare接口就是个错误的实现,一般会实现2个if分支,就是比较的值要求是返回3种情况-1,0,1。为啥要这样?如果你不这样做会产生很多bug,你去看看treemap的源码,在使用你自己实现的comparator借口进行比较的时候有

while (p != null) 
    int cmp = cpr.compare(k, p.key);
    if (cmp < 0)
        p = p.left;
    else if (cmp > 0)
        p = p.right;
    else
        return p;

但是你自己实现的接口没有else那种情况,就是cmp=0那种情况,所以永远得不到key对应的value了。


你的问题有两种方法解决在你的comapre方法改为

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 1;
    else
        return  0;
    

或者你取value的时候不通过get方法,而是通过

Set<Entry<String, Double>> set = sorted_map.entrySet();
for (Entry<String, Double> i : set) 
    System.out.println(i.getValue());

参考技术A TreeMap中排序是依据compareTo()或者compare()方法中重写的标准实现的。如果返回值为0,则添加不成功。同样的,获取指定属性对应的value值,也是使用的compareTo()或者compare()方法。所以要看添加到map中的key,再通过get()方法获取同样key对应的value时,是不是重写的方法不合适,导致返回的int值不为0了。 参考技术B get不到value很可能是由于key不对,检查一下大小写,一般treemap排序后是根据key升序排列的。
分析你的程序发现:实现的时候缺少了一个分支,修改为如下:
while (p != null)
int cmp = cpr.compare(k, p.key);
if (cmp < 0)
p = p.left;
else if (cmp > 0)
p = p.right;
else
return p;
参考技术C 你的compare做错了,compare是比较key,而不是比较value。你现在的做法,不会返回相符和的key,所以无法用key找到value。

public int compare(String a, String b)
return a.compareTo(b);

以上是关于java treeMap 排序后 get不到value的主要内容,如果未能解决你的问题,请参考以下文章

TreeMap自定义compare后get永远返回null的问题

TreeMap自定义compare后get永远返回null的问题

TreeMap自定义compare后get永远返回null的问题

JAVA中基于红黑树实现TreeMap的说明

TreeMap

java中谁更快hashmap.get或treemap.get [重复]