大佬们我创建了两个TreeMap集合,因为TreeMap集合有个构造方法可以放一个Comparator接口的实现类,用于集合元素大小排序。我先创建tree1,然后放进去几个元素。然后再创建tree2集合,构造方法里面放入一个比较器实现类。但是问题是,我把tree1元素放到tree2按值逆序排序后,在tree2里面,通过键获取值却怎么都获取不到,全部为null。但是你单独打印tree2的键和值都可以获取,没问题
调试欢乐多
import java.util.Comparator;
import java.util.TreeMap;/**
* Created by 17092434 on 2019/9/16.
*/
public class TreeMapTest {
public static void main(String[] args) {
TreeMap<String,Integer> tree1 = new TreeMap<String, Integer>();
final String key1 = "A";
tree1.put(key1,65);
tree1.put("B",66);
tree1.put("C",67); TreeMap<String,Integer> tree2 = new TreeMap<String, Integer>(new ComparatorDemo(tree1));
tree2.putAll(tree1);
System.out.println(tree1);
System.out.println(tree2);
System.out.println(tree1.get(key1));
System.out.println(tree2.get(key1));
System.out.println(tree2.values());
}
}class ComparatorDemo implements Comparator<String>{ TreeMap<String,Integer> map = null; public ComparatorDemo(TreeMap<String,Integer> map){
this.map = map;
} public int compare(String o1, String o2) {
if(map.get(o1)>map.get(o2)) return -1;
return 1;
}
}key地址变了,具体原因我再看下。。
前辈,我又创建了一个TreeMap,那不是在堆里面多了一个TreeMap对象嘛。然后会有一个tree2引用变量保存地址。这个地址应该和tree1不一样。所以有点疑惑为啥和地址有关
public int compare(String o1, String o2) {
if(map.get(o1)>map.get(o2)) return -1;
else if(map.get(o1)==map.get(o2)) return 0;
else
return 1;
}少了相等的判断。所有的value不是大于就是小于,需要增加一个相等的分支。
TreeMap的get方法源码里,comparator飞空时,会走到如下分支:final Entry<K,V> getEntryUsingComparator(Object key) {
@SuppressWarnings("unchecked")
K k = (K) key;
Comparator<? super K> cpr = comparator;
if (cpr != null) {
Entry<K,V> p = root;
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;
}
}
return null;
}