【问题标题】:Are multiple comparators being returned?是否返回多个比较器?
【发布时间】:2020-08-30 12:32:05
【问题描述】:
PriorityQueue<Student> pq = new PriorityQueue<(
    Comparator.comparing(Student::getCgpa).reversed()
    .thenComparing(Student::getFname)
    .thenComparing(Student::getToken)
    );

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

【问题讨论】:

  • 你的第二个问题只是回答你的第一个问题:它怎么可能是一个,因为没有返回多个

标签: java comparator priority-queue


【解决方案1】:

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

【讨论】:

  • "返回?否" 这取决于您的意思是返回 来自 的位置。它们显然是从创建它们的方法中返回的。整个表达式计算为单个 Comparator 引用。 (我知道你知道这一点,只是认为值得精确)
  • @Michael 改写了。
【解决方案2】:
  • 是否返回了多个比较器?

    没有

  • 如果是这样,因为这个构造函数只返回一个怎么办?

    根据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(等于元素),则参数一用于返回其决定

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

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
                                                ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多