Erreur Java: “méthode de Comparaison de la viole son contrat général!”
J'ai ce code:
package org.optimization.geneticAlgorithm;
import org.optimization.geneticAlgorithm.selection.Pair;
public abstract class Chromosome implements Comparable<Chromosome> {
public abstract double fitness();
public abstract Pair<Chromosome> crossover(Chromosome parent);
public abstract void mutation();
public int compareTo(Chromosome o) {
int rv = 0;
if (this.fitness() > o.fitness()) {
rv = -1;
} else if (this.fitness() < o.fitness()) {
rv = 1;
}
return rv;
}
}
Et à chaque fois que j'exécute ce code, j'obtiens cette erreur:
Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.ComparableTimSort.mergeHi(ComparableTimSort.java:835)
at java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:453)
at java.util.ComparableTimSort.mergeCollapse(ComparableTimSort.java:376)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:182)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:146)
at java.util.Arrays.sort(Arrays.java:472)
at java.util.Collections.sort(Collections.java:155)
at org.optimization.geneticAlgorithm.GeneticAlgorithm.nextGeneration(GeneticAlgorithm.java:74)
at org.optimization.geneticAlgorithm.GeneticAlgorithm.execute(GeneticAlgorithm.java:40)
at test.newData.InferenceModel.main(InferenceModel.java:134)
- Je utiliser OpenJDK7u3 et je retourne 0 lorsque les objets sont égaux. Quelqu'un peut m'expliquer cette erreur pour moi?
Est votre
fitness()
méthode retourne toujours la même valeur, peu importe combien de fois il est appelé sur le même objet? Pouvez-vous partager des implémentations avec nous?
OriginalL'auteur mariolpantunes | 2012-02-27
Vous devez vous connecter pour publier un commentaire.
Vous pourriez obtenir dans cette situation si vous avez des valeurs NaN:
Par exemple:
Tous de ces imprimer
false
. Donc, vous pourriez vous retrouver dans une situation où deux non-valeurs NaN étaient tous deux considérés comme "égaux" NaN, mais l'une était plus grande que l'autre. Fondamentalement, vous devriez travailler sur la façon dont vous souhaitez gérer des valeurs NaN. Vérifiez également que c'est vraiment le problème, bien sûr... voulez-vous vraiment des valeurs NaN pour votre remise en forme?NaN
valeurs, mais pour info,int Double.compare(double, double)
vais faire une comparaison qui satisfait le Comparateur de contrat. Comme spécifié dans la Javadoc,NaN
valeurs seront considérées comme égales et supérieures à toutes les autres valeurs à l'aide de cette comparaison.OriginalL'auteur Jon Skeet
Probablement, votre fonction de remise en forme est cassé, dans l'une des deux façons suivantes:
compareTo()
n'est pas transitive en présence de NaNs, comme l'explique Jon Skeet.Vous pouvez réécrire votre fonction de comparaison à l'aide de
Double.compare()
:Cela nécessite moins de code et prend soin de coin des cas (NaNs, le négatif, zéro, etc). Bien sûr, si ces cas de coin doit être découlant de la première place est pour vous de décider et de l'adresse.
OriginalL'auteur NPE
Vous devriez essayer d'ajouter
if (this == o) return 0;
Parce que le même objet doit être retourné à l'égalité.
OriginalL'auteur Michael Laffargue