Compare method throw exception: Comparison method violates its general contract

comparator, contract, exception, java

Solution

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;

Problem

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.

Original source

Related problems