package org.drooms.launcher.tournament;
import org.drooms.api.Player;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
public class DroomsTournamentResults extends TournamentResults {
public DroomsTournamentResults(final String name, final Collection<Player> players) {
super(name, players);
}
@Override
protected List<Collection<Player>> evaluateGame(final Collection<Player> players, final GameResults game) {
// group players by their median results
final SortedMap<BigDecimal, Collection<Player>> grouped = new TreeMap<>();
players.forEach(p -> {
grouped.getOrDefault(game.getMedian(p), new HashSet<>()).add(p);
});
// store the results in a reverse order; median biggest to lowest
final List<Collection<Player>> results = new LinkedList<>(grouped.values());
Collections.reverse(results);
return Collections.unmodifiableList(results);
}
@Override
protected SortedMap<Long, Collection<Player>> evaluateTournament(final Collection<Player> players,
final Collection<List<Collection<Player>>> gameResults) {
final Map<Player, Long> points = new HashMap<>();
// value each player
gameResults.forEach(gameResult -> {
// for each game result...
final AtomicInteger i = new AtomicInteger(0);
gameResult.forEach(playersSharingPosition -> {
// for each player sharing the same position
playersSharingPosition.forEach(p -> {
// add 2^position points
points.put(p, points.getOrDefault(p, 0l) + Math.round(Math.pow(2, i.get())));
});
i.incrementAndGet();
});
});
// group players by their results
final SortedMap<Long, Collection<Player>> grouped = new TreeMap<>();
players.forEach(p -> {
grouped.getOrDefault(points.get(p), new HashSet<>()).add(p);
});
return Collections.unmodifiableSortedMap(grouped);
}
}