package magic.model.score; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; import java.util.SortedSet; import java.util.TreeSet; public class MagicMultipleScoreRanking implements MagicScoreRanking { private static final Comparator<MagicScoreResult> BEST_COMPARATOR=new Comparator<MagicScoreResult>() { @Override public int compare(final MagicScoreResult result1,final MagicScoreResult result2) { final int sdif=result2.getScore()-result1.getScore(); if (sdif != 0) { return sdif; } return result1.getPosition()-result2.getPosition(); } }; private static final Comparator<MagicScoreResult> WORST_COMPARATOR=new Comparator<MagicScoreResult>() { @Override public int compare(final MagicScoreResult result1,final MagicScoreResult result2) { final int sdif=result1.getScore()-result2.getScore(); if (sdif != 0) { return sdif; } return result1.getPosition()-result2.getPosition(); } }; private final SortedSet<MagicScoreResult> results; private final boolean best; private int left; private int worstScore; public MagicMultipleScoreRanking(final int maxSize,final boolean best) { this.best=best; results=new TreeSet<MagicScoreResult>(best ? BEST_COMPARATOR : WORST_COMPARATOR); left=maxSize; } public boolean addScore(final int score) { return left != 0 || (best ? score > worstScore : score < worstScore); } public void addScoreResult(final MagicScoreResult result) { results.add(result); if (left==0) { results.remove(results.last()); } else { left--; } worstScore=results.last().getScore(); } @Override public Collection<Object> getResults() { return new ArrayList<Object>(results); } }