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
Java8比较方法违反了comparator中的一般契约问题_Java_Sorting_Java 8_Comparator - Fatal编程技术网

Java8比较方法违反了comparator中的一般契约问题

Java8比较方法违反了comparator中的一般契约问题,java,sorting,java-8,comparator,Java,Sorting,Java 8,Comparator,当我使用下面的比较器对一个对象进行排序时,我得到的比较方法违反了比较器中的一般契约问题 final Set<Span> set = new TreeSet<Span>(new Comparator<Span>() { public int compare(final Span firstSpan, final Span secSpan) { BigInteger s1X0 = firstSpan.getCoordina

当我使用下面的比较器对一个对象进行排序时,我得到的比较方法违反了比较器中的一般契约问题

final Set<Span> set = new TreeSet<Span>(new Comparator<Span>() {

        public int compare(final Span firstSpan, final Span secSpan) {
            BigInteger s1X0 = firstSpan.getCoordinates().getX0();
            BigInteger s1X1 = firstSpan.getCoordinates().getX1();
            BigInteger s2X0 = secSpan.getCoordinates().getX0();
            BigInteger s2X1 = secSpan.getCoordinates().getX1();

            BigInteger s1Y0 = firstSpan.getCoordinates().getY0();
            final BigInteger s2Y0 = secSpan.getCoordinates().getY0();

            if(s1X0.intValue() == s2X0.intValue() && s1X1.intValue() == s2X1.intValue() && s1Y0.intValue() == s2Y0.intValue()){
                return 0;
            }
            if ((s1Y0.intValue() - s2Y0.intValue() <= 5) && (s1Y0.intValue() - s2Y0.intValue() >= -5)) {
                return (s1X0.intValue()>s2X0.intValue()) ? 1 : -1;
            } else {
                if ((s1X0.intValue() >= s2X0.intValue() && s1X0.intValue() <= s2X1.intValue())
                        || (s2X0.intValue() >= s1X0.intValue() && s2X0.intValue() <= s1X1.intValue())) {
                    return (s1Y0.intValue() > s2Y0.intValue()) ? 1 : -1;
                } else {
                    return s1X0.intValue() > s2X0.intValue() ? 1 : -1;
                }
            }

        }

    });
final Set Set=新树集(新比较器(){
公共整数比较(最终跨距第一跨距,最终跨距第二跨距){
BigInteger s1X0=firstSpan.getCoordinates().getX0();
BigInteger s1X1=firstSpan.getCoordinates().getX1();
BigInteger s2X0=secSpan.getCoordinates().getX0();
BigInteger s2X1=secSpan.getCoordinates().getX1();
BigInteger s1Y0=firstSpan.getCoordinates().getY0();
final BigInteger s2Y0=secSpan.getCoordinates().getY0();
如果(s1X0.intValue()==s2X0.intValue()&&s1X1.intValue()==s2X1.intValue()&&s1Y0.intValue()==s2Y0.intValue()){
返回0;
}
如果((s1Y0.intValue()-s2Y0.intValue()=-5)){
返回(s1X0.intValue()>s2X0.intValue())?1:-1;
}否则{
如果((s1X0.intValue()>=s2X0.intValue()&&s1X0.intValue()=s1X0.intValue()&&s2X0.intValue()s2Y0.intValue())?1:-1;
}否则{
返回s1X0.intValue()>s2X0.intValue()?1:-1;
}
}
}
});

A
Comparator
必须对它所比较的对象施加一个总的顺序。特别是这意味着它必须是可传递的,即,如果
A
小于
b
,并且
b
小于
c
,那么
A
必须小于
c
。您的
比较器
不需要保留那笔财产

考虑以下示例:

a.getX0() == 1    b.getX0() == 2    c.getX0() == 3
a.getX1() == 4    b.getX1() == 5    c.getX1() == 6
a.getY0() == 4    b.getY0() == 0    c.getY0() == -4
然后它认为
a
小于
b
(y0的差值小于5),
b
小于
c
(差值小于5),
a
不小于
c
(y0的差值大于5,因此取y0值)

这三个对象应该按什么顺序排序


此外,您的代码还有其他问题。如果您将所有内容都转换为
int
,则可能会发生溢出(这也可能导致您提到的异常)。当数据存储为
biginger
时,还应使用
biginger
s进行比较,例如使用方法
biginger.subtract
biginger.compare

使用biginger.intValue您刚才假设所有数字都适合简单整数


由于BigInteger是可比较的,因此您应该依赖BigInteger.compare,而不是比较int值。

如果您调用的是
intValue()
24次,你为什么不直接使用
s1X0
etc
int
变量呢?这会让你更容易得到帮助,你的代码也更容易阅读。如果你告诉我们你想要实现什么,并理想地提供一个演示问题的例子,我们应该很容易向你展示这个地方如果您的比较不一致。您理解错误消息的含义吗?请仔细阅读的API文档,它解释了
比较
方法的实现要求。您的实现违反了这些要求,因此您必须检查并调整代码以确保其符合要求。
返回s1X0.intValue()>s2X0.intValue()?1:-1;
在我看来不可传递(如果值相等会发生什么情况?)。从何处开始?使用
biginger
表明值可能超过
int
范围,否则,为什么要使用
biginger
?因此仅基于
int
值进行比较容易出错。您也在使用减法而不检查溢出。此外,您能否解释一下比较器的逻辑?然后,重新检查代码是否真的遵循了该逻辑?这应该只是一个注释,而不是完整的答案。由于我没有所需的声誉,我不可能对其他人的答案进行注释,。。。