比较方法违反了它的总契约!在 java 中对图像轮廓进行排序时
Comparison method violates its general contract! while sorting Image contours in java
我知道可能还有其他类似的问题,但他们仍然没有解决我的问题。我正在尝试使用以下方法根据轮廓区域对图像轮廓进行排序:
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));
转换也有点可疑:除非您实际上是要对 Object
的列表进行排序,否则请使用元素类型。假设 contours
是 List<? extends Mat>
:
contours.sort(Comparator.comparingDouble(ImgProc::contourArea));
您可能在这里遇到的具体问题是传递性:如果 a == b
和 b == 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
”。因此,合同被违反。
我知道可能还有其他类似的问题,但他们仍然没有解决我的问题。我正在尝试使用以下方法根据轮廓区域对图像轮廓进行排序:
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));
转换也有点可疑:除非您实际上是要对 Object
的列表进行排序,否则请使用元素类型。假设 contours
是 List<? extends Mat>
:
contours.sort(Comparator.comparingDouble(ImgProc::contourArea));
您可能在这里遇到的具体问题是传递性:如果 a == b
和 b == 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
”。因此,合同被违反。