java - 比较方法违反了它的一般契约!在java中对图像轮廓进行排序时

标签 java sorting opencv compare contour

我知道可能还有其他类似的问题,但他们仍然没有解决我的问题。我正在尝试使用以下命令根据图像轮廓区域对图像轮廓进行排序:

contours.sort((Object o1, Object o2) -> 
(int) (Imgproc.contourArea((MatOfPoint) o1) - Imgproc.contourArea((MatOfPoint) o2) + 0.5));

您看到排序比较很简单(只是区域之间的差异),但我仍然收到提到的错误。我不明白为什么。也许是因为面积是双倍的,我将差值转换为整数?谢谢。

最佳答案

您似乎正在尝试比较 two doubles :

contours.sort(Comparator.comparingDouble(a -> ImgProc.contourArea((MatOfPoint) a));
<小时/>

Actor 阵容也有点可疑:除非您实际上正在尝试对 Object 的列表进行排序,使用元素类型。假设contoursList<? extends Mat> :

contours.sort(Comparator.comparingDouble(ImgProc::contourArea));
<小时/>

您可能遇到的具体问题是传递性:if a == bb == c ,那么比较器的合约要求a == c还。 (这里, x == y 表示 compare(x, y) == 0 )。

但是由于从 double 缩小到 int,违反了这一要求。考虑a = 0 , b = 0.5 , c = 1 :int(b - a) == 0 ,和int(c - b) == 0 ,所以“a == b”和“b == c”。

但是,int(c - a) == 1 ,所以“a != c”。因此,契约(Contract)被违反。

关于java - 比较方法违反了它的一般契约!在java中对图像轮廓进行排序时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53175856/

相关文章:

c++ - 计算轮廓的 x,y 轴长度

opencv - Teensy +红外摄像机+ OpenCV

java - 小程序卡在加载中

java - 打印排序和未排序数组时的时间差异

python - 按字母顺序对 argparse 帮助进行排序

sorting - Ransack gem - 不区分大小写的排序(Rails 4)

python - Windows,导入错误: DLL load failed: The specified module could not be found

java - 为什么要使用字符串标识符来访问资源数据?

java - PriorityQueue 按两个值排序

Java:在 Windows 和 Linux 上处理注销或关机