Ho ricevuto il seguente errore: "Il metodo di confronto viola il suo contratto generale!" quando si utilizza il seguente comparatore, tuttavia non riesco a replicare l'eccezione usando jUnit. Mi piacerebbe sapere cosa ha causato questo problema e come replicarlo. Ci sono esempi di altri che hanno lo stesso problema ma non come replicarlo.Impossibile replicare: "Il metodo di confronto viola il suo contratto generale!"
public class DtoComparator implements Comparator<Dto> {
@Override
public int compare(Dto r1, Dto r2) {
int value = 0;
value = r1.getOrder() - r2.getOrder();
if (value == 0 && !isValueNull(r1.getDate(), r2.getDate()))
value = r1.getDate().compareTo(r2.getDate());
return value;
}
private boolean isValueNull(Date date, Date date2) {
return date == null || date2 == null;
}
}
Il codice viene chiamato utilizzando:
Collections.sort(dtos, new DtoComparator());
Grazie per qualsiasi aiuto.
Ulteriori informazioni: L'errore sembrava verificarsi nella classe TimSort all'interno dei programmi di utilità Java e all'interno di un metodo chiamato mergeLo. Link: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util/TimSort.java#TimSort.mergeLo%28int%2Cint%2Cint%2Cint%29
Avete ordini molto grandi (positivi o negativi)? – immibis
Ciao immibis, Gli ordini vanno da 1-20 –
La domanda per la quale non riesce per gli elenchi con lunghezza> = 32 è stata appena data risposta [qui] (http://stackoverflow.com/q/29866539/1639625) –