Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何用比较器实现Treemap?_Java_Comparator_Treemap - Fatal编程技术网

Java 如何用比较器实现Treemap?

Java 如何用比较器实现Treemap?,java,comparator,treemap,Java,Comparator,Treemap,我在这个问题上遇到的错误已经解决,并写在下面的答案部分 问题是下面的TreeMap定义抛出了一个编译器错误,我想知道原因 Comparator<Student> comparator=new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { // TODO Auto-generated

我在这个问题上遇到的错误已经解决,并写在下面的答案部分

问题是下面的TreeMap定义抛出了一个编译器错误,我想知道原因

Comparator<Student> comparator=new Comparator<Student>() {

            @Override
            public int compare(Student o1, Student o2) {
                // TODO Auto-generated method stub
                if(o1.roll<=o2.roll)
                    return -1;
                else return 1;
            }
        };
        TreeMap<Integer, Student> map=new TreeMap<>(comparator);
我不明白Treemap的这个实现是错误的原因。有人能解释一下这里发生了什么吗?

比较处理三种情况的需要:小于、大于和等于。当它们相等时,需要返回0

if (o1.roll == o2.roll) {
    return 0;
}
else if (o1.roll < o2.roll) {
    return -1;
}
else {
    return 1;
}
在Java 8中,您可以在一行中创建整个比较器:

Map<Integer, Student> map = new TreeMap<>(Comparator.comparingInt(s -> s.roll));
TL;DR:树形图的比较器需要比较整数,而不是学生

树映射从整数“键”映射到学生对象“值”,并按整数对映射进行排序。因此,构造函数不接受比较器作为参数

根据TreeMap的文档,将以比较器作为参数的构造函数声明为

    TreeMap​(Comparator<? super K> comparator)
如果要按学生的卷号存储学生,只需按如下方式插入:

        Student me = new Student();
        map.put(me.roll, me);
副作用是地图按滚动排序


PS中的信息也是正确的,比较器需要处理三种情况。和Comparator.comparingits->s.roll或Comparator.comparingitstudent::getRoll如果类有这样一个getter,则建议使用,这不仅是为了简洁,更重要的是因为它不容易出错。

是什么让您认为代码错了?如果您遇到任何意外的结果,请明确说明您预期的结果以及观察到的结果的差异,以便我们能够理解您的问题,并最终帮助您。尝试您的最后一行“我得到”卷无法解决或不是字段。这是因为编译器在Integer类中查找roll,而不是在Student中。有意义。。。我对-1、0和1的用法感到困惑。谢谢你的帮助!!我只需要颠倒TreeMap的论点。
    TreeMap<Integer, Student> map = new TreeMap<>();        
        Student me = new Student();
        map.put(me.roll, me);