是否返回多个比较器?

问题描述

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

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

解决方法

是否要返回多个比较器?”-是的,在技术层面上。除了链中的最后一个,每个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
,
  • 是否要返回多个比较器?

  • 如果是这样,原因是因为此构造函数仅返回一个?

    根据thenComparing文档,给定的比较器与前一个比较器链接在一起,该比较器可以使用多个规则对值进行排序


根据代码

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);
    };
}

新的比较器对此应用

  • 使用自己的比较测试
  • 如果值是0(等于元素),则参数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
                                                ...

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...