package world.bentobox.level.objects; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; import java.util.UUID; import java.util.stream.Collectors; import org.eclipse.jdt.annotation.Nullable; import com.google.gson.annotations.Expose; import world.bentobox.bentobox.database.objects.DataObject; /** * This class stores and sorts the top ten. * @author ben * */ public class TopTenData implements DataObject { // UniqueId is the world name @Expose private String uniqueId = ""; @Expose private Map topTen = new LinkedHashMap<>(); public Map getTopTen() { // Remove any entries that have level values less than 1 topTen.values().removeIf(l -> l < 1); return topTen.entrySet().stream() .sorted(Collections.reverseOrder(Map.Entry.comparingByValue())).limit(10) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new)); } /** * Get the level for the rank * @param rank - rank * @return level value or 0 if none. */ public long getTopTenLevel(int rank) { Map tt = getTopTen(); return tt.size() < rank ? (long)tt.values().toArray()[(rank-1)] : 0; } /** * Get the UUID of the rank * @param rank - rank * @return UUID or null */ @Nullable public UUID getTopTenUUID(int rank) { Map tt = getTopTen(); return tt.size() < rank ? (UUID)tt.keySet().toArray()[(rank-1)] : null; } public void setTopTen(Map topTen) { this.topTen = topTen; } @Override public String getUniqueId() { // This is the world name return uniqueId; } @Override public void setUniqueId(String uniqueId) { // This is the world name - make it always lowercase this.uniqueId = uniqueId.toLowerCase(); } /** * Add level for this island owner or team leader, sort the top ten and limit to ten entries * @param uuid - UUID of owner or team leader * @param level - island level */ public void addLevel(UUID uuid, Long level) { this.topTen.put(uuid, level); } /** * Get the level for this UUID, or zero if the UUID is not found * @param uuid - UUID to check * @return island level */ public long getLevel(UUID uuid) { if (topTen.containsKey(uuid)) return topTen.get(uuid); return 0L; } /** * Removes ownerUUID from the top ten * @param ownerUUID - UUID to remove */ public void remove(UUID ownerUUID) { this.topTen.remove(ownerUUID); } }