Sorting Java集合按比较器排序给定错误
我曾尝试使用集合对Java ArrayList进行排序,但它不起作用,尽管我试图遵循其他集合的代码 我有一个名为PcdPoint的类,它的方法是getScore()和getType(),其中getScore()返回一个double,getType()返回一个整数。(不是原子的) 下面的代码应该可以工作,但它给了我一个错误:“无法推断类型”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
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)
。注意“比较”和“然后比较”,而不是“排序”和“再次排序”。