2016-06-14 2 views
0

Я обновляемом один проект из JDK 7, JDK 8, где первоначально мы встречаем исключение:Collection.sort не сортировать должным образом в JDK 8 после реализации useLegacyMergesort истинного

java.lang.IllegalArgumentException: метод сравнения нарушает его общий договор ! в java.util.TimSort.mergeHi (Unknown Source) в java.util.TimSort.mergeAt (Unknown Source) в java.util.TimSort.mergeCollapse (Unknown Source) в java.util.TimSort.sort (Неизвестно Источник) на java.util.Arrays.sort (Unknown Source) в java.util.ArrayList.sort (Unknown Source) в java.util.Collections.sort (Unknown Source)

что мы решили с использованием Системных свойств java.util.Arrays.useLegacyMergeSort как true. После чего исключение было разрешено, но сортировка, выполняющая его, неверна (неправильная сортировка).

Примечание: В JDK 7 же кода работают отлично (без этой системы свойств)

public class SortTableModelRowComparator implements Comparator<TableModelSortingRow> 
{ 
    private boolean ascending = true; 
    protected int[] sortingColumns; 

    /** 
    * Constructor 
    * 
    */ 
    public SortTableModelRowComparator(boolean pSortAscendending, int[] pSortingColumns) 
    { 
     ascending=pSortAscendending; 
     sortingColumns=pSortingColumns; 
    } 

    @Override 
    public int compare(TableModelSortingRow o1, 
      TableModelSortingRow o2) { 
     BigDecimal firstvalue=(BigDecimal)o1.getValue(7); 
     BigDecimal secondvalue=(BigDecimal)o2.getValue(7); 

     return firstvalue.compareTo(secondvalue); 
    } 
} 
+1

Мы не знаем ни того типа, который вы сортируете, ни каких экземпляров, ни того, что сравнивается r вы используете для сортировки. –

+0

Добавлен класс компаратора. Не могли бы вы предложить что-то. – Bhanu

+0

Что делает 'getValue (7)' do? –

ответ

4

То есть проблема с использованием этого флага.

Исходное исключение означает, что что-то не так с вашей операцией сравнения Comparator или Comparable. Что-то об этом нарушает договор Comparable что действительное сравнение нуждается в, чтобы повиноваться. По сути, это ошибка в вашем приложении.

Когда вы устанавливаете этот флаг, вы сообщаете JVM игнорировать проблему. В некоторых случаях вы можете избежать этого. В других ... как и ваши ... последствия будут в некотором роде.

Решение: Подумайте, почему вы получали исключение и исправляете эту проблему.

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


Примечание: В JDK 7 же кода работают отлично (без этой системы свойств)

Алгоритмы сортировки, используемые в Java 7 & Java 8 отличаются . Тем не менее, вполне возможно, что вы получили неправильные сортировки в Java 7, и вы этого не заметили.


1 - The Comparator contract выглядит следующим образом:

«В приведенном выше описании, обозначение обозначает математическую функцию сигнум, который определен для возврата одного из -1, 0, или 1 в зависимости от того, является ли значение выражения отрицательным, нулевым или положительным.

  • реализатор должен гарантировать, что sgn(compare(x, y)) == -sgn(compare(y, x)) для всех x и y. (Это означает, что compare(x, y) должен бросить исключение тогда и только тогда, когдаcompare(y, x) бросает исключение.)

  • реализатор должен также гарантировать, что отношение транзитивно: ((compare(x, y)>0) && (compare(y, z)>0)) подразумевает compare(x, z)>0.

  • Наконец, реализатор должен убедиться, что compare(x, y)==0 подразумевает, что sgn(compare(x, z))==sgn(compare(y, z)) для всех z «

2 -. Кроме того, в Java 7 реализации алгоритма не проверяет неправильное поведение в операции сравнения. Это объясняет, почему у вас нет исключения в Java 7.

+0

Я добавил свой компаратор и связанные файлы для сортировки с моим вопросом. Не могли бы вы посмотреть и сообщить мне, что может быть проблемой. – Bhanu

+0

«что-то мутирует объекты, пока они сортируются» Не могли бы вы объяснить это. – Bhanu

+0

Мутирование == изменение. Это то, что вы не поняли? –

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

  • Нет связанных вопросов^_^