The issue is probably casting a long
to int
, which may convert a large long
number to a negative int
.
For example, consider this snippet :
long first = Integer.MAX_VALUE + 1;
long second = 0;
System.out.println((int) (first - second));
System.out.println((int) (second - first));
Output :
-2147483648
-2147483648
If you would pass to your compare
method two Conversation
instances - let's call them x
and y
- whose getTime()
is equal to first
and second
in the above snippet respectively, both compare(x,y)
and compare(y,x)
would return a negative value, which violates the contract of that method.
Try :
Collections.sort(activeConverstions, new Comparator<Conversation>() {
@Override
public int compare(Conversation o1, Conversation o2) {
return o2.getTime() > o1.getTime() ? 1 : o2.getTime() < o1.getTime() ? -1 : 0;
}
});
or, as assylias suggested :
Collections.sort(activeConverstions, new Comparator<Conversation>() {
@Override
public int compare(Conversation o1, Conversation o2) {
return Long.compare(o2,getTime(), o1.getTime());
}
});