【问题标题】:Collections.sort comparison method violates its general contractCollections.sort 比较方法违反了它的一般约定
【发布时间】:2015-06-03 08:29:23
【问题描述】:

首先,很抱歉再次就这个话题提出问题。我很清楚这里有很多问题和答案。我已经阅读了其中的一些,但我的问题是我仍然无法弄清楚我做错了什么。这是我的代码:

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 坐标位于左上角。点是双精度类型。这是错误消息:

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)

【问题讨论】:

  • 显示错误信息。
  • Line.p1.x等坐标变量的类型是什么?
  • 你应该解释你想如何对你的行进行排序
  • 我会在一分钟内将信息添加到主要问题中。谢谢。
  • 请问英文线路的订购标准是什么?

标签: java sorting collections comparator


【解决方案1】:

这不是正确的顺序。

考虑第一种方法:

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

这意味着如果您将 y 坐标为 4 和 6 的 Point 与 y 坐标为 6 和 4 的 Point 进行比较,无论第一个参数是哪个 Point,您都将返回 -1,这相当于说 Point1 "

您的compare 方法应该处理 lhs.p1.y 和 rhs.p1.y (&lt;,&gt;,==) 的关系以及 lhs.p2.y 和rhs.p2.y (&lt;,&gt;,==)。即您必须涵盖表单的 9 个条件 (lhs.p1.y rel rhs.p1.y && lhs.p2.y rel rhs.p2.y) 其中 rel 是 &lt;,&gt;==

【讨论】:

  • 谢谢,我试试这个。
猜你喜欢
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多