Collections.ort比较方法违反了其一般约定



首先,很抱歉再次向您提问。我很清楚这里有很多问题和答案。我读过其中的一些,但我的问题是,我仍然无法弄清楚自己做错了什么。这是我的代码:

Collections.sort(hLines, new Comparator<Line>() {
        @Override
        public int compare(Line lhs, Line rhs) {
            if ( lhs.p1.y < rhs.p1.y){
                if (lhs.p2.y < rhs.p2.y)
                    return 1;
                else
                    return -1;
            }
            if (lhs.p1.y > rhs.p1.y){
                if (lhs.p2.y > rhs.p2.y)
                    return -1;
                else
                    return 1;
            }
            else
                return 0;
        }
    });
    Collections.sort(vLines, new Comparator<Line>() {
        @Override
        public int compare(Line lhs, Line rhs) {
            if ( lhs.p1.x < rhs.p1.x){
                if (lhs.p2.x < rhs.p2.x)
                    return 1;
                else
                    return -1;
            }
            if (lhs.p1.x > rhs.p1.x){
                if (lhs.p2.x > rhs.p2.x)
                    return -1;
                else
                    return 1;
            }
            else
            return 0;
        }
    });

我似乎只是视而不见,所以如果你们中有人能帮我解决这个问题,我会非常感激。

编辑:我想做的是确定一条线是坐标系中的上、下、最左边还是最右边的线,坐标系的0/0坐标在左上角。这些点数属于double类型。这是错误消息:

06-03 10:42:22.576: E/OpenCV_NativeCamera(15810): CameraHandler::Notify: msgType=4 ext1=0 ext2=0
06-03 10:42:22.815: E/OpenCV_NativeCamera(15810): CameraHandler::Notify: msgType=4 ext1=1 ext2=0
06-03 10:42:22.848: E/OpenCV_NativeCamera(15810): CameraHandler::Notify: msgType=4 ext1=1 ext2=0
06-03 10:42:26.408: E/OpenCV_NativeCamera(15810): CameraHandler::Notify: msgType=4 ext1=0 ext2=0
06-03 10:42:26.747: E/OpenCV_NativeCamera(15810): CameraHandler::Notify: msgType=4 ext1=1 ext2=0
06-03 10:42:26.781: E/OpenCV_NativeCamera(15810): CameraHandler::Notify: msgType=4 ext1=1 ext2=0
06-03 10:42:29.474: E/OpenCV_NativeCamera(15810): CameraHandler::Notify: msgType=4 ext1=0 ext2=0
06-03 10:42:30.613: E/OpenCV_NativeCamera(15810): CameraHandler::Notify: msgType=4 ext1=0 ext2=0
06-03 10:42:30.646: E/OpenCV_NativeCamera(15810): CameraHandler::Notify: msgType=4 ext1=0 ext2=0
06-03 10:42:30.874: E/AndroidRuntime(15810): FATAL EXCEPTION: Thread-2592
06-03 10:42:30.874: E/AndroidRuntime(15810): java.lang.IllegalArgumentException: Comparison method violates its general contract!
06-03 10:42:30.874: E/AndroidRuntime(15810):    at java.util.TimSort.mergeHi(TimSort.java:864)
06-03 10:42:30.874: E/AndroidRuntime(15810):    at java.util.TimSort.mergeAt(TimSort.java:481)
06-03 10:42:30.874: E/AndroidRuntime(15810):    at java.util.TimSort.mergeForceCollapse(TimSort.java:422)
06-03 10:42:30.874: E/AndroidRuntime(15810):    at java.util.TimSort.sort(TimSort.java:219)
06-03 10:42:30.874: E/AndroidRuntime(15810):    at java.util.TimSort.sort(TimSort.java:169)
06-03 10:42:30.874: E/AndroidRuntime(15810):    at java.util.Arrays.sort(Arrays.java:2038)
06-03 10:42:30.874: E/AndroidRuntime(15810):    at java.util.Collections.sort(Collections.java:1891)
06-03 10:42:30.874: E/AndroidRuntime(15810):    at com.example.camera.RectangleDetector.drawLines(RectangleDetector.java:108)
06-03 10:42:30.874: E/AndroidRuntime(15810):    at com.example.camera.RectangleDetector.findRectangle(RectangleDetector.java:94)
06-03 10:42:30.874: E/AndroidRuntime(15810):    at com.example.camera.MainActivity.onCameraFrame(MainActivity.java:114)
06-03 10:42:30.874: E/AndroidRuntime(15810):    at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:387)
06-03 10:42:30.874: E/AndroidRuntime(15810):    at org.opencv.android.NativeCameraView$CameraWorker.run(NativeCameraView.java:177)
06-03 10:42:30.874: E/AndroidRuntime(15810):    at java.lang.Thread.run(Thread.java:838)

这不是一个正确的排序。

考虑第一种方法:

如果第一个(左(点的y坐标都小于第二个(右(点的y坐标,则返回1,否则返回-1。

这意味着,如果您将y坐标为4和6的点与y坐标为6和4的点进行比较,则无论哪个点是第一个参数,都将返回-1,这相当于说Point1"<"Point2"<"Point1,这应该只有在Point1"=="Point2时才可能。

您的compare方法应该处理lhs.p1.y和rhs.p1.y关系(<>==(以及lhs.p2.y和rhs.p2.y关系的每个组合(<>==(。即,你必须覆盖形式的9个条件(lhs.p1.y rel-rhs.p1.y&lhs.p2.y rel-rhs.p2.y(,其中rel是<>==

最新更新