关于比较接口Comparator的问题

weixin_45650202 2019-09-16 07:23:23
大佬们我创建了两个TreeMap集合,因为TreeMap集合有个构造方法可以放一个Comparator接口的实现类,用于集合元素大小排序。我先创建tree1,然后放进去几个元素。然后再创建tree2集合,构造方法里面放入一个比较器实现类。但是问题是,我把tree1元素放到tree2按值逆序排序后,在tree2里面,通过键获取值却怎么都获取不到,全部为null。但是你单独打印tree2的键和值都可以获取,没问题
...全文
143 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
oh_Maxy 2019-09-16
  • 打赏
  • 举报
回复
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;
}
oh_Maxy 2019-09-16
  • 打赏
  • 举报
回复

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不是大于就是小于,需要增加一个相等的分支。
weixin_45650202 2019-09-16
  • 打赏
  • 举报
回复
引用 2 楼 oh_Maxy 的回复:

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不一样。所以有点疑惑为啥和地址有关
oh_Maxy 2019-09-16
  • 打赏
  • 举报
回复

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地址变了,具体原因我再看下。。
oh_Maxy 2019-09-16
  • 打赏
  • 举报
回复
能把你的代码文本拷贝下吗?目测tree2.get("A")不应该为null

62,625

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧