大佬们我创建了两个TreeMap集合,因为TreeMap集合有个构造方法可以放一个Comparator接口的实现类,用于集合元素大小排序。我先创建tree1,然后放进去几个元素。然后再创建tree2集合,构造方法里面放入一个比较器实现类。但是问题是,我把tree1元素放到tree2按值逆序排序后,在tree2里面,通过键获取值却怎么都获取不到,全部为null。但是你单独打印tree2的键和值都可以获取,没问题

解决方案 »

  1.   

    能把你的代码文本拷贝下吗?目测tree2.get("A")不应该为null
      

  2.   


    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地址变了,具体原因我再看下。。
      

  3.   


    前辈,我又创建了一个TreeMap,那不是在堆里面多了一个TreeMap对象嘛。然后会有一个tree2引用变量保存地址。这个地址应该和tree1不一样。所以有点疑惑为啥和地址有关
      

  4.   


        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不是大于就是小于,需要增加一个相等的分支。
      

  5.   

    tree2是自带比较器的,和默认比较器不一样,所以get的值,要根据比较器的计算结果判断是否是自己想要get的值。
    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;
        }