Мы написали следующий код, который не работает для метода Comparator
.Компаратор не работает
public int compare(Object o1, Object o2)
{
if (o2 == null) return 1;
else if (o1 == null) return -1;
MailObject a = (MailObject)o1;
MailObject b = (MailObject)o2;
return a.getType() < b.getType()? 1 : -1;
}
, где метод getType()
возвращает целочисленное значение. и следующий код работает отлично
public int compare(Object o1, Object o2)
{
if (o2 == null) return 1;
else if (o1 == null) return -1;
MailObject a = (MailObject)o1;
MailObject b = (MailObject)o2;
return a.getType() - b.getType();
}
Если удалить тройной оператор в обратном заявлении, то он работает нормально. Если мы добавим равную проверку, то и она работает нормально. Зачем?
первый блок кода подачи следующее исключение:
07:45:22 ERROR c.c.servlet.MyServlet - Comparison method violates its general contract!
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(Unknown Source) ~[na:1.8.0_25]
at java.util.TimSort.mergeAt(Unknown Source) ~[na:1.8.0_25]
at java.util.TimSort.mergeCollapse(Unknown Source) ~[na:1.8.0_25]
at java.util.TimSort.sort(Unknown Source) ~[na:1.8.0_25]
at java.util.Arrays.sort(Unknown Source) ~[na:1.8.0_25]
at java.util.List.sort(Unknown Source) ~[na:1.8.0_25]
at java.util.Collections.sort(Unknown Source) ~[na:1.8.0_25]
Какую ошибку вы получаете? А что такое класс MailObject? – proudandhonour
Зачем вам нужен тройной оператор? – Munyari
** Почему вы не набираете свой компаратор прямо? ** – Makoto