Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:将Collection.sort和lambda表达式与三元运算符结合使用会导致意外的结果_Java - Fatal编程技术网

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

Java:将Collection.sort和lambda表达式与三元运算符结合使用会导致意外的结果,java,Java,我有以下课程: 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) -

我有以下课程:

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);
    }
}
import java.util.*;
甲级{
公共静态void main(字符串…参数){
var list=new ArrayList();
列表。添加(“测试”);
列表。添加(“abc”);
Collections.sort(list,(a,b)->a.length()>=b.length()?1:0);//[test,abc]
//Collections.sort(list,(a,b)->a.compareTo(b));//[abc,test]
系统输出打印项次(列表);
}
}
我以为
Collection.sort()
会对accending进行排序。我认为
a.length()
是4,而
b.length()
是3,其计算结果为
(4>=3)
正确。那么
a.length()>=b.length()?1:0将返回1,表示
“test”
大于
“abc”
。所以它应该像
[abc,test]
那样排序

但是当我将代码更改为
a.length()>=b.length()时,我只得到结果?1:-1
,这似乎表明
a.length()>=b.length()
的计算结果为
false
。为什么呢

为什么第一个lambda表达式导致
[test,abc]
,而修改后的版本导致
[abc,test]


Collections.sort(列表(a,b)->a.compareTo(b))
的工作原理与预期一致。

阅读
Comparator
:的文档或用于实现它的lambda,如果
a
,则必须返回负值,如果
a>b
,则必须返回正值。如果
a
等于(或比较等于)
b
,则它也必须返回零。这与其他一些编程语言中的期望不同,我想这是让您感到困惑的地方

从不关注积极的输出,只关注消极的输出,这将是排序的一个完全有效的实现。它似乎没有按照您期望的顺序进行比较


您可以将此比较器正确地实现为
(a,b)->Integer.compare(a.length(),b.length())
,或者更简单地实现为
比较器。comparingit(String::length)

如果相等,IIRC也需要返回0,因此为相同长度返回1也不是一个好主意。我理解ab应该是正的,这就是a.compareTo(b)的作用。我不明白的是为什么改变三元运算符false的情况会改变排序的结果。我还是不明白它是怎么工作的。澄清一下:我更感兴趣的是为什么这样做,然后找到一种方法来获得正确的结果。@richard关于你的评论“a==b”…不,双等号表示相同的对象引用,即
a
&
b
都指向同一个对象,指向内存中的同一位置。这里的讨论不是关于对象标识的。这里的讨论是关于方法的。此方法通常考虑对象状态的内容,而不是对象标识。在一个比较器的头脑中,记忆中两个不同的物体可能被认为是相等的。是的,对了,我错了。我的意思是a等于b。所以问题是,(a,b)并不意味着它将导致“test”>=“abc”,但在这种情况下,它将比较“abc”>=“test”,并给我0,这将导致列表未按预期顺序排序。我想我现在明白了。