Java ne vérifie pas la cohérence au sens strict, mais vous avertit uniquement en cas de problème grave. Il ne vous donne pas non plus beaucoup d'informations sur l'erreur.
J'étais perplexe quant à ce qui se passait dans ma trieuse et j'ai créé un vérificateur de cohérence strict, peut-être que cela vous aidera :
/**
* @param dailyReports
* @param comparator
*/
public static <T> void checkConsitency(final List<T> dailyReports, final Comparator<T> comparator) {
final Map<T, List<T>> objectMapSmallerOnes = new HashMap<T, List<T>>();
iterateDistinctPairs(dailyReports.iterator(), new IPairIteratorCallback<T>() {
/**
* @param o1
* @param o2
*/
@Override
public void pair(T o1, T o2) {
final int diff = comparator.compare(o1, o2);
if (diff < Compare.EQUAL) {
checkConsistency(objectMapSmallerOnes, o1, o2);
getListSafely(objectMapSmallerOnes, o2).add(o1);
} else if (Compare.EQUAL < diff) {
checkConsistency(objectMapSmallerOnes, o2, o1);
getListSafely(objectMapSmallerOnes, o1).add(o2);
} else {
throw new IllegalStateException("Equals not expected?");
}
}
});
}
/**
* @param objectMapSmallerOnes
* @param o1
* @param o2
*/
static <T> void checkConsistency(final Map<T, List<T>> objectMapSmallerOnes, T o1, T o2) {
final List<T> smallerThan = objectMapSmallerOnes.get(o1);
if (smallerThan != null) {
for (final T o : smallerThan) {
if (o == o2) {
throw new IllegalStateException(o2 + " cannot be smaller than " + o1 + " if it's supposed to be vice versa.");
}
checkConsistency(objectMapSmallerOnes, o, o2);
}
}
}
/**
* @param keyMapValues
* @param key
* @param <Key>
* @param <Value>
* @return List<Value>
*/
public static <Key, Value> List<Value> getListSafely(Map<Key, List<Value>> keyMapValues, Key key) {
List<Value> values = keyMapValues.get(key);
if (values == null) {
keyMapValues.put(key, values = new LinkedList<Value>());
}
return values;
}
/**
* @author Oku
*
* @param <T>
*/
public interface IPairIteratorCallback<T> {
/**
* @param o1
* @param o2
*/
void pair(T o1, T o2);
}
/**
*
* Iterates through each distinct unordered pair formed by the elements of a given iterator
*
* @param it
* @param callback
*/
public static <T> void iterateDistinctPairs(final Iterator<T> it, IPairIteratorCallback<T> callback) {
List<T> list = Convert.toMinimumArrayList(new Iterable<T>() {
@Override
public Iterator<T> iterator() {
return it;
}
});
for (int outerIndex = 0; outerIndex < list.size() - 1; outerIndex++) {
for (int innerIndex = outerIndex + 1; innerIndex < list.size(); innerIndex++) {
callback.pair(list.get(outerIndex), list.get(innerIndex));
}
}
}
1 votes
Quels sont le nom et la classe de l'exception ? S'agit-il d'une exception de type IllegalArgumentException ? Si je devais deviner, je penserais que vous devriez faire
s1.getParent().equals(s2)
au lieu des1.getParent() == s2
.0 votes
Ainsi que l'exception qui est levée.
2 votes
Je ne connais pas très bien Java ou les API de comparaison de Java, mais cette méthode de comparaison semble tout à fait erronée. Supposons que
s1
est le parent des2
ys2
n'est pas le parent des1
. EnsuitecompareParents(s1, s2)
es0
maiscompareParents(s2, s1)
es1
. Cela n'a pas de sens. (De plus, il n'est pas transitif, comme aix mentionné ci-dessous).4 votes
Cette erreur ne semble être produite que par une bibliothèque spécifique cr.openjdk.java.net/~martin/webrevs/openjdk7/timsort/src/share/
0 votes
En Java, vous pouvez utiliser equals (qui renvoie un booléen) ou compareTo (qui renvoie -1, 0 ou +1). Surchargez ces fonctions dans votre classe Foo et après cela, vous pouvez vérifier s1.getParent().equals(s2) ...
0 votes
La levée ou non de l'exception dépend de la version du JRE utilisée. Java6 l'autorise, Java 7 et 8 lèvent l'erreur.