Java 具有多个字段的自定义比较器排序
因为这个问题与我的最后一个问题有关,我会的 假设我有一个带有两个整数的类Java 具有多个字段的自定义比较器排序,java,sorting,object,comparator,Java,Sorting,Object,Comparator,因为这个问题与我的最后一个问题有关,我会的 假设我有一个带有两个整数的类TestB。我可以在a和b上排序List,如下所示: list.sort(Comparator.comparing(TestB::getA).thenComparing(TestB::getB)); 现在,我想知道如何使用上一个答案中的自定义比较器进行此操作。一个选项是使用我所称的自定义通用多重比较器: list2.sort(getComparator( p -> p.getTestB().getA(), p
TestB
。我可以在a
和b
上排序List
,如下所示:
list.sort(Comparator.comparing(TestB::getA).thenComparing(TestB::getB));
现在,我想知道如何使用上一个答案中的自定义比较器进行此操作。一个选项是使用我所称的自定义通用多重比较器:
list2.sort(getComparator( p -> p.getTestB().getA(),
p -> p.getTestB().getB() ));
private <T> Comparator<T> getComparator( Function<T, ? extends Comparable<?>>... functions ) {
return new Comparator<T>() {
@Override
public int compare(T obj1, T obj2) {
for (Function<T, ? extends Comparable<?>> function : functions) {
Comparable<T> res1 = (Comparable<T>) function.apply(obj1);
Comparable<T> res2 = (Comparable<T>) function.apply(obj2);
int result = res1.compareTo((T) res2);
if ( result != 0 ) {
return result;
}
}
return 0;
}
};
}
list2.sort(getComparator(p->p.getTestB().getA(),
p->p.getTestB().getB());
专用比较器getComparator(函数>函数:函数){
可比res1=(可比)函数。应用(obj1);
可比res2=(可比)函数。应用(obj2);
int result=res1.compareTo((T)res2);
如果(结果!=0){
返回结果;
}
}
返回0;
}
};
}
它将根据函数参数的放置顺序从左到右排序。尽管如此,仍将发出警告。因为它非常通用。
请记住,要比较的最终值的类型必须实现Comparator(像Integer这样的基本类型已经实现了),并且您应该处理空问题(我在这里这样做不是为了让它简短)。自定义
Comparator
版本的list.sort(Comparator.comparating(TestB::getA)。然后比较(TestB::getB))代码>是:
list.sort(新的比较器(){
@凌驾
公共int比较(testb1、testb2){
int cmp=b1.getA().compareTo(b2.getA());
如果(cmp==0)
cmp=b1.getB()。与(b2.getB())相比;
返回cmp;
}
});
至少对我来说,这个问题还不清楚。帮助我们帮助您-分享一些示例数据和您希望为itokay获得的结果谢谢,我希望得到一个优雅而简单的解决方案。我将等待更多的回答。当我尝试上面的代码“不能在原语类型int上调用compareTo(int)”时,我会得到这个错误。它与Integer.compare()一起工作fine@heapoverflow您的代码正在调用comparing()
,而不是comparingit()
,这导致假设a
和b
是对象,而不是原语。如果a
是int
,则使用Integer.compare(b1.getA(),b2.getA())
。与其他原语类似,在适当的类(Long
,Double
,…)上使用compare()
方法仅供参考:尽管comparing()
对您有效,但使用comparingit()
将防止不必要的原语自动装箱。