问题
Possible Duplicate:
why does my compare method throw exception — Comparison method violates its general contract!
I've this code:
class TimeComparatorTipo0 implements Comparator {
@Override
public int compare(Object a, Object b) {
String Time1 = ((DataImportedTipo0) a).ora;
Long VolTot1 = Long.parseLong(((DataImportedTipo0) a).volume_totale);
String Time2 = ((DataImportedTipo0) b).ora;
Long VolTot2 = Long.parseLong(((DataImportedTipo0) b).volume_totale);
if (Time1.equals(Time2))
{
if ( VolTot1.compareTo(VolTot2) > 0)
return 1;
else
return -1;
}
else
return Time1.compareTo(Time2);
}
};
Sometimes it thrown this exception:
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:868)
at java.util.TimSort.mergeAt(TimSort.java:485)
at java.util.TimSort.mergeForceCollapse(TimSort.java:426)
at java.util.TimSort.sort(TimSort.java:223)
at java.util.TimSort.sort(TimSort.java:173)
at java.util.Arrays.sort(Arrays.java:659)
at java.util.Collections.sort(Collections.java:217)
at ManageUrl.DownloadUrl.StartThreadDowloadTipo0(DownloadUrl.java:893)
at ManageUrl.DownloadUpdateWorkflow$ConsumerTipo0.run(DownloadUpdateWorkflow.java:278)
Why ?
1) how can I avoid it? 2) how can i catch this exception ?
Thanks in advance.
回答1:
If you have two elements when are equal a
and b
you will get compare(a, b) == -1
and compare(b, a) == -1
which doesn't make any sense.
You can simplify the code with and make it more efficient with
class TimeComparatorTipo0 implements Comparator<DataImportedTipo0> {
@Override
public int compare(DataImportedTipo0 a, DataImportedTipo0 b) {
String Time1 = a.ora, Time2 = b.ora;
int cmp = Time1.compareTo(Time2);
if (cmp == 0) {
// avoid expensive operations.
Long VolTot1 = Long.parseLong(a.volume_totale);
Long VolTot2 = Long.parseLong(b.volume_totale);
cmp = VolTot1.compareTo(VolTot2);
}
return cmp;
来源:https://stackoverflow.com/questions/10234038/compare-method-throw-exception-comparison-method-violates-its-general-contract