gpt4 book ai didi

Java:将 Collection.sort 和 lambda 表达式与三元运算符结合使用会导致意外结果

转载 作者:行者123 更新时间:2023-12-05 08:47:29 25 4
gpt4 key购买 nike

我有以下类(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 : -1,这似乎表明 a.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com