Казалось, все работает нормально (в течение нескольких дней), но я столкнулся с проблемой только один раз, и мне было очень трудно воспроизвести проблему.
"Метод сравнения нарушает свой общий контракт!" был брошен и полностью застал меня врасплох. У меня есть следующее:
public class CustomComparator implements Comparator<Chromosome> {
public int compare(Chromosome c1, Chromosome c2){
return c1.compareTo(c2);
}
}
Мой класс хромосом:
public class Chromosome implements Comparable<Chromosome>{
private double rank;
//bunch of methods...
@Override public int compareTo(Chromosome c){
final int BEFORE = -1;
final int EQUAL = 0;
final int AFTER = 1;
if (this.getRank() == c.getRank()) //getRank() simply returns a double value 'rank'
return EQUAL;
else if (this.getRank() < c.getRank())
return BEFORE;
else //i.e. (this.getRank() > c.getRank())
return AFTER;
}
У меня есть ArrayList, и я использовал как Collections.sort(MyList), так и Collections.sort(MyList, Collections.reverseOrder()). Они до сих пор нормально работают. Я просто столкнулся с этой ошибкой только один раз из 100 пробега. Что-то не так с этой реализацией?
0.0/0.0
или что-то в этом роде. - person Gábor Bakos   schedule 06.12.2014return Double.compare(this.rank, c.rank);
. И ваш собственный компаратор бесполезен, поскольку он вызываетcompareTo
на самих экземплярах хромосомы. - person Alexis C.   schedule 06.12.2014