Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.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_Comparator_Comparable_Timsort - Fatal编程技术网

Java “尽可能最好”;“通用”;比较器的实现?

Java “尽可能最好”;“通用”;比较器的实现?,java,comparator,comparable,timsort,Java,Comparator,Comparable,Timsort,最近,我们在从Java6迁移到Java7时遇到了一些问题,因为我们实现了大量的比较器,但它们并没有满足可比较的契约,并且使用新的Timsort算法抛出了一个异常 编辑:来自用户Marco Forberg的输入和类签名 我现在发现了一个比较器,其他许多比较器都是从它扩展而来的,比较方法如下: @Override public int compare(final T o1, final T o2) { return 0; } public class MyComparator<T&g

最近,我们在从Java6迁移到Java7时遇到了一些问题,因为我们实现了大量的比较器,但它们并没有满足可比较的契约,并且使用新的Timsort算法抛出了一个异常

编辑:来自用户Marco Forberg的输入和类签名

我现在发现了一个比较器,其他许多比较器都是从它扩展而来的,比较方法如下:

@Override
public int compare(final T o1, final T o2) {
    return 0;
}
public class MyComparator<T> implements Comparator<T> {
我把它改成了这个,希望我能涵盖大部分案例:

 @Override
public int compare(final T o1, final T o2) {

    //Case: XOR check for either s1 or s2 being null
    if(o1 == null ^ o2 == null){
        return (o1 == null) ? -1 : 1;
    }

    //Case: both are null
    if(o1 == o2){
        return 0;
    }

    //Case: Its Comparable!
    if(o1 instanceof Comparable && o2 instanceof Comparable){
        Comparable c1 = (Comparable) o1;
        Comparable c2 = (Comparable) o2;

        return ObjectUtils.compare(c1, c2);
    }

    //Case: We don't know (ran for years this way)
    return 0;
}
类签名如下所示:

@Override
public int compare(final T o1, final T o2) {
    return 0;
}
public class MyComparator<T> implements Comparator<T> {
公共类MyComparator实现Comparator{
虽然
ObjectUtils
来自ApacheCommons3,并提供了一个空安全比较方法(我知道我调用它的时候,由于前面的检查,这两个对象都不能为空,我也可以使用c1.compare(c2))

这是否改善了“基本”比较器的行为?(我假设)
我是对的,这基本上涵盖了可比较的合同,因为对于不可比较的对象,现在返回值0。

更改“两者都为空”如果两个参数都是同一个对象,并且都是空的,则可以使用case to
o1==o2
。谢谢您的输入,因为Apache Commons就是这样做的。我将用edid编辑我的文章。@R.J:谢谢您的更正……您知道我如何用空格格式化代码并提高可读性吗?(当我创建问题时,它看起来都很好……然后我将其发布,并以这种方式进行修剪)你可以看到一个橙色的?,在问题框上方,标题下方,在右手边。你可以用它来帮助你设置格式。就你的代码而言,我觉得它很整洁。不用担心it@R.J:非常感谢您的反馈,再次感谢您的编辑改进了我的问题。我将阅读表格本周末的装潢信息,尝试在未来填补stackoverflow的高质量等级。祝您有一个美好的一天!