我正在解决这个问题,我应该从给定的点平面中找到包含三个以上点的线段。我正在使用比较器对点进行排序,将一个点作为参考,并根据参考的斜率对其他点进行排序,而我在输入大时遇到问题。我收到一个错误消息,说“比较方法违反了它的一般约定!”。
我尝试过修改比较器,但是它似乎适用于少量输入。
`public Comparator<Point> slopeOrder() {
return new Comparator<Point>() {
@Override
public int compare(Point p1, Point p2) {
double slope1 = slopeTo(p1);
double slope2 = slopeTo(p2);
return slope1 == slope2 ? 0 : (slope1 > slope2 ? 1 : -1);
}
};
}`
这段代码是用Point类编写的,我的代码应该输出Line片段,但是我得到的排序错误是
Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.base/java.util.TimSort.mergeHi(TimSort.java:899)
at java.base/java.util.TimSort.mergeAt(TimSort.java:516)
at java.base/java.util.TimSort.mergeCollapse(TimSort.java:441)
at java.base/java.util.TimSort.sort(TimSort.java:245)
at java.base/java.util.Arrays.sort(Arrays.java:1440)
at FastCollinearPoints.<init>(FastCollinearPoints.java:28)
at FastCollinearPoints.main(FastCollinearPoints.java:87)