Метод сравнения нарушает его общий договор! при сортировке контуров изображения в java - PullRequest
0 голосов
/ 06 ноября 2018

Я знаю, что могут быть и другие подобные вопросы, но они все еще не решили мою проблему. Я пытаюсь отсортировать контуры изображения на основе их области контура, используя следующее:

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

Вы видите, что сравнение сортировки простое (только разница между областями), но я все еще получаю упомянутую ошибку. Я не мог понять, почему. Может быть, потому что области двойные, а я конвертирую разницу в int? Спасибо.

1 Ответ

0 голосов
/ 06 ноября 2018

Похоже, вы пытаетесь сравнить два двойных :

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". Таким образом, договор нарушен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...