2013-08-21 4 views
2

У меня есть собственный, относительно сложный компаратор строк и большой список строк (~ 100 строк, которые уже пытались уменьшить, но тогда проблема не воспроизводима), где их сортировка вызывает вышеупомянутую ошибку при попытке сортировки с Java 7. I предположим, что правилоОтладка «Метод сравнения нарушает общий контракт!»

if a < b and b < c then a < c 

может быть нарушен. Каков наилучший способ найти образец, который нарушает договор?

+2

Можете ли вы разместить свой реальный код? –

+0

У вас есть * любые * юнит-тесты для вашего компаратора? – Raedwald

+2

Не уменьшайте список; вместо этого уменьшите * компаратор *, шаг за шагом, одновременно воспроизводя ошибку с тем же набором входных данных. Затем опубликуйте * минимальный * компаратор, который все еще страдает от проблемы. Однако в этот момент это может стать для вас очевидным. –

ответ

3

ОК, я сделал это с перебором-путь: 3 вложенные циклы, чтобы сравнить 3 значения друг с другом и проверить приведенное выше правило. Теперь нашел образец, где правило нарушено.

+0

почтовый индекс пожалуйста. – Buffalo

+2

@Buffalo И это немного похоже на следующее: для (узел узла1: узлы1) для (узел узла2: узлы2) для (узел узла3: узлы3), если (node1.compareTo (node2) <0 && node2.compareTo (node3) <0 && node1.compareTo (node3)> 0) alertVioaltionOfContract (node1, node2, node3); – Torsten

+0

@Torsten спасибо! – Buffalo

1

добавить отлаживать сообщение при запуске вашего сравнения() метод и Equals()/хэш-код() методы (? Переопределении их право)

+0

Что не так с этим ответом, что вы проголосовали? у вас будет проблематичное значение за минуту –

+0

Методы равных и хэш-кодов не должны использоваться при использовании компаратора. –

+0

Вы правы, что пользовательский компаратор им может не понадобиться. Но это не помешает их переопределить. –

Смежные вопросы