我有以下类(class):
import java.util.*;
class ClassA {
public static void main(String...args) {
var list = new ArrayList<String>();
list.add("test");
list.add("abc");
Collections.sort(list, (a, b) -> a.length() >= b.length() ? 1 : 0); // [test, abc]
//Collections.sort(list, (a, b) -> a.compareTo(b)); // [abc, test]
System.out.println(list);
}
}
我认为 Collection.sort()
会按顺序排序。我认为 a.length()
是 4 而 b.length()
是 3,这将评估为 (4 >= 3)
true。所以 a.length() >= b.length() ? 1 : 0
将返回 1,表示 "test"
大于 "abc"
。所以它应该像 [abc, test]
一样排序。
但是当我将代码更改为 a.length() >= b.length() 时,我只会得到结果
,这似乎表明 [abc, test]
吗? 1 : -1a.length() >= b.length()
的计算结果为 false
。这是为什么?
为什么第一个 lambda 表达式导致 [test, abc]
,而修改后的版本导致 [abc, test]
?
Collections.sort(list, (a, b) -> a.compareTo(b));
按预期工作。
最佳答案
阅读 Comparator
的文档: compare
,或者你用来实现它的 lambda,如果 a < b
必须返回一个负值,如果 a > b
不只是一个正值.如果 a
,它也必须返回零等于(或比较等于)b
.这与其他一些编程语言的预期不同,我想这就是让您感到困惑的地方。
这将是一个完全有效的 sort
实现从不关注积极的输出,只关注消极的输出。它似乎没有按照您预期的顺序进行比较。
您可以将此比较器正确实现为 (a, b) -> Integer.compare(a.length(), b.length())
,或更简单地表示为 Comparator.comparingInt(String::length)
.
关于Java:将 Collection.sort 和 lambda 表达式与三元运算符结合使用会导致意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67654568/