2014-01-09 3 views
3

Я в процессе обновления нашего проекта до java 7. Я столкнулся с исключением Illegal Argument для Collections.sort(). Я знаю, что причиной исключения является новый Timsort в java 7 (я действительно бросал все вопросы, поднятые ранее по этому вопросу). Теперь мне нужно изменить логику сравнения, чтобы преодолеть это исключение. Вот мой метод сравненияJava 7: java.lang.IllegalArgumentException: метод сравнения нарушает его общий контракт

if (o1.isLookup() && !o2.isLookup()) { 
    return -1; 
} 
if (!o1.isLookup() && o2.isLookup()) { 
    return 1; 
} 

if (o1.dependsOn(o2)) { 
    return 1; 
} 
if (o2.dependsOn(o1)) { 
    return -1; 
} 
return 0; 
  1. Я попытался перекрывая равный() метод, с той же логикой, как сравнивать, думать, если сравнить равные и возвращать тот же результат, он должен решить эту проблему; но это не сработало, как ожидалось.

  2. Когда я разделил метод сравнения на два с отдельными компараторами, как показано ниже, сортировка (с использованием обоих компараторов) не вызывает никаких исключений. Что может быть возможной причиной?

код ниже:

protected Comparator<EntityWrapper> getComparator2() {  
    return new Comparator<EntityWrapper>() { 
     public int compare(EntityWrapper o1, EntityWrapper o2) { 
      if (o1.dependsOn(o2.entityClass)) { 
       // This depends on otherWrapper 
       return 1; 
      } 
      if (o2.dependsOn(o1.entityClass)) { 
       // OtherWrapper depends on this 
       return -1; 
      } 
      return 0; 
     } 
    }; 
} 

protected Comparator<EntityWrapper> getComparator1() { 
    return new Comparator<EntityWrapper>() { 
public int compare(EntityWrapper o1, EntityWrapper o2) { 
     if (o1.isLookup() && !o2.isLookup()) { 
      return -1; 
     } 
     if (!o1.isLookup() && o2.isLookup()) { 
      return 1; 
     } 
     return 0; 
    }; 
} 
+2

возможно, что 'o1.dependsOn (o2) и' o2 .dependsOn (o1) 'оба являются истинными? – Henry

+1

Трудно комментировать, если мы не увидим, что здесь делает метод 'dependsOn' и' isLookup'. –

+0

Невозможно говорить для вашего конкретного примера, но убедитесь, что ваша функция сравнения относится к понятию строгого слабого упорядочения. То есть, если a a и тому подобное. –

ответ

0

Вы не хватает ".entityClass", такие как:

if (o1.isLookup() && !o2.isLookup()) { 
    return -1; 
} 
if (!o1.isLookup() && o2.isLookup()) { 
    return 1; 
} 

if (o1.dependsOn(o2.entityClass)) { 
    return 1; 
} 
if (o2.dependsOn(o1.entityClass)) { 
    return -1; 
} 
return 0; 
Смежные вопросы