如何解决是否返回多个比较器?
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
...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。