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
Java 具有多个字段的自定义比较器排序_Java_Sorting_Object_Comparator - Fatal编程技术网

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()
将防止不必要的原语自动装箱。