有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是否返回多个比较器?

PriorityQueue<Student> pq = new PriorityQueue<(
    Comparator.comparing(Student::getCgpa).reversed()
    .thenComparing(Student::getFname)
    .thenComparing(Student::getToken)
    );

是否返回多个比较器?如果是,如何,, 因为这个构造函数只返回一个


共 (2) 个答案

  1. # 1 楼答案

    • 是否返回多个比较器

      没有

    • 如果是这样的话,为什么这个构造函数只返回一个呢

      ^{}文档中,给定的比较器与一个比较器中的前一个比较器相链接,该比较器可以使用多个规则对值进行排序


    从代码中

    default Comparator<T> thenComparing(Comparator<? super T> other) {
        Objects.requireNonNull(other);
        return (Comparator<T> & Serializable) (c1, c2) -> {
            int res = compare(c1, c2);
            return (res != 0) ? res : other.compare(c1, c2);
        };
    }
    

    新的比较器应用了这一点

    • 使用自己的比较测试
    • 如果value为0(equals元素),则使用参数one返回其决策

    所以事实上,在递归测试中使用多个链接会产生结果

    Comparator<Foo> cmp = Comparator.comparingInt(Foo::getA)
            .thenComparing(Foo::getB)
            .thenComparing(Foo::getC)
            .thenComparing(Foo::getD);
    
    getA ->  1
         -> -1
         ->  0 -> getB ->  1
                       -> -1
                       ->  0 -> getC ->  1
                                     -> -1
                                     ->  0 -> getC ->  1
                                                   -> -1
                                                    ...
    
  2. # 2 楼答案

    是否返回多个比较器?”-是的,在技术层面。链中除最后一个之外的每个Comparator都用于创建另一个Comparator(通过调用reversed()thenComparing())。但只有一个作为参数传递给PriorityQueue

    Comparator.comparing(Student::getCgpa) // <- 1st comparator created & returned
        .reversed()                        // <- 2nd comparator created & returned
        .thenComparing(Student::getFname)  // <- 3nd comparator created & returned
        .thenComparing(Student::getToken)  // <- 4th comparator created, returned & passed along as argument