Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Sorting Java集合按比较器排序给定错误_Sorting_Collections_Java 8 - Fatal编程技术网

Sorting Java集合按比较器排序给定错误

Sorting Java集合按比较器排序给定错误,sorting,collections,java-8,Sorting,Collections,Java 8,我曾尝试使用集合对Java ArrayList进行排序,但它不起作用,尽管我试图遵循其他集合的代码 我有一个名为PcdPoint的类,它的方法是getScore()和getType(),其中getScore()返回一个double,getType()返回一个整数。(不是原子的) 下面的代码应该可以工作,但它给了我一个错误:“无法推断类型” Collections.sort(点列表、, Comparator.comparing((PCD点a,PCD点b)->a.getScore()-b.getSc

我曾尝试使用集合对Java ArrayList进行排序,但它不起作用,尽管我试图遵循其他集合的代码

我有一个名为PcdPoint的类,它的方法是getScore()和getType(),其中getScore()返回一个double,getType()返回一个整数。(不是原子的)

下面的代码应该可以工作,但它给了我一个错误:“无法推断类型”

Collections.sort(点列表、,
Comparator.comparing((PCD点a,PCD点b)->a.getScore()-b.getScore())
。然后比较((PcdPoint a,PcdPoint b)->a.getType()-b.getType());
因此,我尝试查找文档并尝试这样做

Collections.sort(点列表、,
Comparator.comparing((a,b)->a.getScore()-b.getScore())
.然后比较((a,b)->a.getType()-b.getType());

Collections.sort(点列表、,
Comparator.comparing((a,b)->a.getScore()-b.getScore())
.然后比较((a,b)->a.getType()-b.getType());

但是这两种方法似乎都不起作用。

如果您想先按分数排序,然后再按类型排序,那么您的比较器应该如下所示

Collections.sort(pointList, 
    Comparator.comparingDouble(PcdPoint::getScore)
        .thenComparingInt(PcdPoint::getType));

首先,从
double
中减去
double
会得到
double
,但是比较器的
compare
方法必须返回
int
。除此之外,使用减号作为比较器实现通常是错误的,因为它可能会溢出。你混合了两种实现比较器的方法。或者,实现一个完整的比较器,例如,
(PcdPoint a,PcdPoint b)->Double.compare(a.getScore(),b.getScore()
,或者使用提供getter方法的工厂方法之一:
comparator.comparating((PcdPoint p)->p.getScore())
或者更好的
comparator.comparatingdouble(PcdPoint::getScore)
。它确实正确编译和运行,但有意外的行为。它首先按分数正确排序,但随后没有按类型正确排序(a:0,c:0,b:0,c:1,b:1,a:1)。当我更改顺序时,它会先按类型正确排序(a,b,c),然后按分数对每个类型列表进行排序(a:0,a:1,b:0,b:1,c:1)@霍尔格:谢谢你把它带进来!我犯了一个错误。@JackAvante它没有多次排序。你正在创建一个具有第一(主)顺序和第二顺序的比较器。列表根据指定的比较器排序一次。这正是预期的行为。如果“type”是您的主要排序标准,请首先指定它,即
比较器。comparingInt(PcdPoint::getType)。然后comparingdouble(PcdPoint::getScore)
。注意“比较”和“然后比较”,而不是“排序”和“再次排序”。