WedX - журнал о программировании и компьютерных науках

Как Java обнаруживает нарушение контракта компаратора?

Я нахожу удивительным, что Java иногда может проверить контракт компаратора для вас.

Например, когда вы пишете отношение порядка, которое не следует транзитивности, вы получаете

java.lang.IllegalArgumentException: Comparison method violates its general contract!

Как можно проверить такое нарушение? Как Java это реализует?


(см. этот вопрос, если вы не знаете о чем я)


Ответы:


1

Вы не указали конкретно когда получить это исключение. Я предполагаю, что вы получаете это, когда делаете вызов Collections.sort со своим собственным Comparator в качестве аргумента, потому что именно там я смог найти эту ошибку в исходном коде Java.

https://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util/TimSort.java#773

(TimSort — это реализация, используемая для Collections.sort)

Когда ваш Comparator несовместим (результат compare(a,b) не согласуется с результатом compare(b,a)) или нестабилен - не возвращает тот же результат для одного и того же ввода, вы получите внутреннюю несогласованность во временном состоянии, которое метод TimSort держит.

Алгоритм обнаруживает это внутреннее несоответствие и выдает исключение:

772        } else if (len1 == 0) {
773            throw new IllegalArgumentException(
774                "Comparison method violates its general contract!");
775        } 

Обратите внимание: нет гарантии, что вы получите это исключение, когда ваш компаратор разорвет свой контракт (это было бы здорово для модульного тестирования вашего компаратора).

Это может быть просто неправильно для ввода, который вы случайно передали конкретному вызову Collections.sort, или несогласованный вывод вашего компаратора может просто не привести к внутренней несогласованности в методе TimSort. В этом случае еще возможно, что результирующий порядок сортировки неверен, но вы не гарантируете, что получите исключение.

06.06.2015

2

Конечно, он не может доказать это, проверив ваш код!

Нарушение обнаруживается для конкретных входов и в некоторых ветвях кода. Например

if( compare(x,y)==0 && compare(y,x)!=0 )
    throw IllegalArgumentException: Comparison method violates its general contract!

Просто проверьте фактический источник, в котором возникает исключение, например. https://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util/TimSort.java#772

06.06.2015
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]