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借口进行比较的时候有
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的问题