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
This commit is contained in:
BONNe 2022-07-07 11:27:11 +03:00
parent 218e5fc6c4
commit 26fb55748f
1 changed files with 18 additions and 31 deletions

View File

@ -113,41 +113,28 @@ public class ChallengesManager
* This comparator orders challenges by their level, order and name. * This comparator orders challenges by their level, order and name.
*/ */
private final Comparator<Challenge> challengeComparator = (o1, o2) -> { private final Comparator<Challenge> 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()) return Integer.compare(o1.getOrder(), o2.getOrder());
{ }
// If orders are equal, sort by unique id else if (o1Level == null)
return o1.getUniqueId().compareToIgnoreCase(o2.getUniqueId()); {
} return -1;
else }
{ else if (o2Level == null)
// If levels are equal, sort them by order numbers. {
return Integer.compare(o1.getOrder(), o2.getOrder()); return 1;
} }
else if (o1Level.equals(o2Level))
{
return Integer.compare(o1.getOrder(), o2.getOrder());
} }
else else
{ {
if (o1.getLevel().isEmpty() || o2.getLevel().isEmpty()) return Integer.compare(o1Level.getOrder(), o2Level.getOrder());
{
// 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());
}
}
} }
}; };