package com.kapti.pointsmanager.pointevents.RankingEvents; import com.kapti.client.user.PointsType; import com.kapti.client.user.User; import com.kapti.exceptions.StockPlayException; import com.kapti.pointsmanager.util.Profit; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import org.apache.log4j.Logger; /** * Deze ranking beloont de spelers die de grootste hoeveelheid winst heeft * gemaakt in de voorbije dag. * * @author Dieter */ public class ProfitRanking extends ARankingEvent { private static int RANKINGPLAATSEN = 25; private static Logger logger = Logger.getLogger(ProfitRanking.class); private HashMap<User, Double> profitMap; public ProfitRanking(Collection<User> users) { super(users); } @Override public PointsType getType() { return PointsType.PROFIT; } @Override protected HashMap<User, Integer> calculateWinners(Collection<User> users) { profitMap = new HashMap<User, Double>(); List<Profit> profitList = new ArrayList<Profit>(); //Winst van alle gebruikers berekenen Iterator<User> iterator = users.iterator(); while(iterator.hasNext()) { User user = iterator.next(); try { Profit profit = new Profit(user); profitList.add(profit); profitMap.put(user, profit.getProfit()); } catch (StockPlayException ex) { logger.error("Error when trying to calculate profit for user " + user.getId(), ex); } } //Rangschikken volgens gemaakte winst Collections.sort(profitList, new ProfitComparer()); //Hashmap maken met scores voor iedere speler HashMap<User, Integer> winnersMap = new HashMap<User, Integer>(); for(int i=0 ; i<RANKINGPLAATSEN ; i++) { if (i < profitList.size()) winnersMap.put(profitList.get(i).getUser(), RANKINGPLAATSEN-i); } return winnersMap; } @Override public String getDescription(User user) { if(winners.containsKey(user)) { DecimalFormat df = new DecimalFormat("#.##"); return "Nr. " + (RANKINGPLAATSEN-winners.get(user)+1) + " (" + df.format(profitMap.get(user)) + "€)"; } else return null; } @Override public int getPoints(User user) { if(winners.containsKey(user)) return winners.get(user); else return 0; } //Rangschikt van hoog naar laag volgens winst private class ProfitComparer implements Comparator<Profit> { public int compare(Profit o1, Profit o2) { if(o1.getProfit() < o2.getProfit()) return 1; else if(o1.getProfit() == o2.getProfit()) return 0; else return -1; } } }