Need to sort some items based on a time stamp/ current hour and/or the name property of the item's person object in alphabetical order. How would I correct the IllegalArgumentException which is thrown in some cases?
public static final Comparator<Item> sortByTimeAndName = new Comparator<Item>() {
@Override
public int compare(Item lhs, Item rhs) {
if(lhs.getDate() != null && rhs.getDate != null){
if (lhs.getDate().getTime() < rhs.getDate().getTime()) {
return -1;
} else if (lhs.getDate().getTime() == rhs.getDate().getTime()) {
if (lhs.getHour() < rhs.getHour()) {
return -1;
} else if (lhs.getHour() == rhs.getHour()) {
if(lhs.getPerson().getName().compareTo(rhs.getPerson().getName()) == 0){
// if two persons have same name, sort by person id
if (lhs.getPerson().getID() < rhs.getPerson().getID()){
return -1;
}
}
else{
return lhs.getPatient().getName().compareTo(rhs.getPatient().getName());
}
}
}
}else{
if (lhs.getHour() < rhs.getHour()) {
return -1;
} else if (lhs.getHour() == rhs.getHour()) {
if(lhs.getPerson().getName().compareTo(rhs.getPerson().getName()) == 0){
if (lhs.getPerson().getID() < rhs.getPerson().getID()){
return -1;
}
}
else{
return lhs.getPerson().getName().compareTo(rhs.getPerson().getName());
}
}
}
return 1;
}
};
Stack trace:
Caused by java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeLo(TimSort.java:761)
at java.util.TimSort.mergeAt(TimSort.java:497)
at java.util.TimSort.mergeCollapse(TimSort.java:421)
at java.util.TimSort.sort(TimSort.java:210)
at java.util.Arrays.sort(Arrays.java:1998)
at java.util.Collections.sort(Collections.java:1900)
....