Я попробовал много возможных решений, указанный на сети хотите установить системное свойство и конвертировать в два раза, но все еще получаю ту же ошибку:Получение ошибки: Метод сравнения нарушает его генподряд
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.ComparableTimSort.mergeHi(ComparableTimSort.java:835)
at java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:453)
at java.util.ComparableTimSort.mergeForceCollapse(ComparableTimSort.java:392)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:191)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:146)
at java.util.Arrays.sort(Arrays.java:472)
at java.util.Collections.sort(Collections.java:155)
Вот мой код:
System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");
Collections.sort(docs, new Comparator<FeedDocument>() {
public int compare(FeedDocument o1, FeedDocument o2) {
int year1 = 0;
int year2 = 0;
int returnResult = 0;
if (o1.containsKey(FeedConstants.PUBLICATION_YEAR)
&& o2.containsKey(FeedConstants.PUBLICATION_YEAR)
&& o1.get(FeedConstants.PUBLICATION_YEAR) != null
&& (o1.get(FeedConstants.PUBLICATION_YEAR) instanceof String)
&& o2.get(FeedConstants.PUBLICATION_YEAR) != null
&& (o2.get(FeedConstants.PUBLICATION_YEAR) instanceof String)) {
String firstyear = (String) o1.get((FeedConstants.PUBLICATION_YEAR));
String secondyear = (String) o2.get((FeedConstants.PUBLICATION_YEAR));
if (firstyear.equals(secondyear)) {
return 0;
} else if (firstyear != null && !firstyear.isEmpty() && secondyear != null
&& !secondyear.isEmpty()) {
year1 = Integer.parseInt(firstyear.trim());
year2 = Integer.parseInt(secondyear.trim());
// int result = year2 - year1;
// if (result > 0) {
// returnResult = 1;
// } else if (result < 0) {
// returnResult = -1;
// }
return Double.compare(year2, year1);
}
} else {
returnResult = 0;
}
return returnResult;
}
});
Возможный дубликат [«Метод сравнения нарушает его общий контракт!»] (Http://stackoverflow.com/questions/8327514/comparison-method-violates-its-general-contract) – bradimus
Просто FYI 'instanceof' возвращает' false 'если его левый аргумент равен нулю, нет необходимости в другой проверке. – mszymborski
Да, вы можете комбинировать 'o1.containsKey (FeedConstants.PUBLICATION_YEAR) && o1.get (FeedConstants.PUBLICATION_YEAR)! = Null && o1.get (FeedConstants.PUBLICATION_YEAR) instanceof String' в просто' o1.get (FeedConstants.PUBLICATION_YEAR) instanceof String'. У вас также есть дополнительные ненужные проверки в будущем: 'firstyear! = Null' и' secondyear! = Null'. Они просто загромождают код и затрудняют его выполнение. – mapeters