From 26fb55748f6414797bc3ab45d0fa30150de2796c Mon Sep 17 00:00:00 2001 From: BONNe Date: Thu, 7 Jul 2022 11:27:11 +0300 Subject: [PATCH] Solves "Comparison method violates its general contract!" crash. I reworked a comparator for challenges a bit. I did not find the reason why previous was wrong, as it should return the same result as the new one, but for some reason this works, and previous do not. Fixes #296 --- .../managers/ChallengesManager.java | 49 +++++++------------ 1 file changed, 18 insertions(+), 31 deletions(-) diff --git a/src/main/java/world/bentobox/challenges/managers/ChallengesManager.java b/src/main/java/world/bentobox/challenges/managers/ChallengesManager.java index 6e19df9..7b9221e 100644 --- a/src/main/java/world/bentobox/challenges/managers/ChallengesManager.java +++ b/src/main/java/world/bentobox/challenges/managers/ChallengesManager.java @@ -113,41 +113,28 @@ public class ChallengesManager * This comparator orders challenges by their level, order and name. */ private final Comparator challengeComparator = (o1, o2) -> { - if (o1.getLevel().equals(o2.getLevel())) + ChallengeLevel o1Level = this.getLevel(o1.getLevel()); + ChallengeLevel o2Level = this.getLevel(o2.getLevel()); + + if (o1Level == null && o2Level == null) { - if (o1.getOrder() == o2.getOrder()) - { - // If orders are equal, sort by unique id - return o1.getUniqueId().compareToIgnoreCase(o2.getUniqueId()); - } - else - { - // If levels are equal, sort them by order numbers. - return Integer.compare(o1.getOrder(), o2.getOrder()); - } + return Integer.compare(o1.getOrder(), o2.getOrder()); + } + else if (o1Level == null) + { + return -1; + } + else if (o2Level == null) + { + return 1; + } + else if (o1Level.equals(o2Level)) + { + return Integer.compare(o1.getOrder(), o2.getOrder()); } else { - if (o1.getLevel().isEmpty() || o2.getLevel().isEmpty()) - { - // If exist free level challenge, then it should be at the start. - return Boolean.compare(o2.getLevel().isEmpty(), o1.getLevel().isEmpty()); - } - else - { - ChallengeLevel o1Level = this.getLevel(o1.getLevel()); - ChallengeLevel o2Level = this.getLevel(o2.getLevel()); - - if (o1Level == null || o2Level == null) - { - return Boolean.compare(o1Level == null, o2Level == null); - } - else - { - // Sort by challenges level order numbers - return Integer.compare(o1Level.getOrder(), o2Level.getOrder()); - } - } + return Integer.compare(o1Level.getOrder(), o2Level.getOrder()); } };