2016-11-03 5 views
0

Я видел различные вопросы, связанные с ошибкой Timsort здесь, и применил изменение кода на основе этого. Но ни один из них не дает мне результата. Пожалуйста, помогите мне в разрешении моей ошибки. Код:Метод сравнения нарушает его общий контракт - ошибка TimSort.mergeLo

public int compare(Record record1, Record record2) { 
    int indexOfRecord1=records.indexOf(record1); 
    int indexOfRecord2=records.indexOf(record2); 

    Integer sortIndexOfRecord1=indexToSortIndexMap.get(indexOfRecord1); 
    Integer sortIndexOfRecord2=indexToSortIndexMap.get(indexOfRecord2); 

    //Option 1: Throws same Timsort error: 
    if(sortIndexOfRecord1!=null && sortIndexOfRecord2!=null){ 
     return sortIndexOfRecord1.compareTo(sortIndexOfRecord2); 
    }else{ 
     return (sortIndexOfRecord1==null && sortIndexOfRecord2==null)?0:(sortIndexOfRecord1==null)?-1:1; 
    } 
    //Reframed the above logic like below. I got the same error 
    //Option 2: Throws same Timsort error: 
    /* 
    if(sortIndexOfRecord1!=null && sortIndexOfRecord2!=null){ 
     if(sortIndexOfRecord1.intValue() == sortIndexOfRecord2.intValue()) 
      return 0; 
     else if(sortIndexOfRecord1.intValue() < sortIndexOfRecord2.intValue()) 
      return -1; 
     else if(sortIndexOfRecord1.intValue() > sortIndexOfRecord2.intValue()) 
      return 1; 
    }else if(sortIndexOfRecord1==null && sortIndexOfRecord2==null){ 
     return 0; 
    }else if(sortIndexOfRecord1==null && sortIndexOfRecord2!=null){ 
     return -1; 
    }else if(sortIndexOfRecord1!=null && sortIndexOfRecord2==null){ 
     return 1; 
    } 
    return 0; 
    */ 


    //Option 3: Throws same Timsort error: 
    /* 
    int index1 = -1; 
    int index2 = -1; 
    if(record1 != null && record2 != null){ 
     index1 = indexToSortIndexMap.get(indexOfRecord1)!=null?indexToSortIndexMap.get(indexOfRecord1):-1 ; 
     index2 = indexToSortIndexMap.get(indexOfRecord2)!=null?indexToSortIndexMap.get(indexOfRecord2):-1 ; 
    }else if(record1 != null && record2 == null){ 
     index1 = indexToSortIndexMap.get(indexOfRecord1)!=null?indexToSortIndexMap.get(indexOfRecord1):-1 ; 
    }else if(record1 == null && record2 != null){ 
     index2 = indexToSortIndexMap.get(indexOfRecord2)!=null?indexToSortIndexMap.get(indexOfRecord2):-1 ; 
    }else{ 
     index1 = -1; 
     index2 = -1; 
    } 

    if (index1 > index2){ 
     return +1; 
    }else if (index1 < index2){ 
     return -1; 
    }else{ 
     return 0; 
    } 
    */ 

Все вышеизложенное дает ошибку ниже:

Caused by: java.lang.IllegalArgumentException: Comparison method violates its general contract! 
at java.util.TimSort.mergeLo(Unknown Source) 
at java.util.TimSort.mergeAt(Unknown Source) 
at java.util.TimSort.mergeCollapse(Unknown Source) 
at java.util.TimSort.sort(Unknown Source) 
+0

Я также попробовал другие варианты. Это тоже дает ту же ошибку. 'code' – Ismail

+2

Huh. Это странно. Существует ли какая-либо возможность одновременного изменения «записей» или «indexToSortIndexMap»? –

+0

@LouisWasserman Nope.It не был одновременно изменен. Я обновил код со всеми возможными параметрами. – Ismail

ответ

0

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

return Comparator.nullsFirst(Integer::compare) 
       .compare(sortIndexOfRecord1, sortIndexOfRecord2); 

Один из возможных ответов, что вы на самом деле сортировки списка records, который вы используете, чтобы получить индекс записи. Это действительно плохая идея.

+0

Или получить действительно фантазию: 'Компаратор c1 = Comparator.comparing ((Запись r) -> indexToSortIndexMap.get (records.indexOf (r)));' then' return Comparator.nullsFirst (c1) .compare (record1, record2); '. Но сообщенная ошибка в значительной степени _must_ связана с одновременной модификацией одного или нескольких из этих объектов. – Enwired

+0

Я получил вашу оценку сортировки 'records'. Проблема заключается в одновременной модификации. Позвольте мне переделать код и попробовать. Благодарю. – Ismail

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