private static void theEnd() {
Map<Client, Integer> Score = new HashMap<Client, Integer>();
for (Client player : getPlayers()) {
Client c = (Client) player;
Score.add(c, c.gameScore);
}
}
基本上,它遍历所有客户端,并将他们的游戏分数添加到我的新地图分数中。 现在,我让arraylist准备好了价值观,我想在比赛中指定一名获胜者。
要成为胜利者,您必须获得最高分。
我的问题:
如何在地图集中找到最高的游戏分数?
答案 0 :(得分:2)
如果您只想找到最高分但不关心Client
取得的最高分,您可以使用Collections.max
int maxScore = Collections.max(Score.values());
如果您关心客户端和分数,您可以使用匿名Comparator
实例获取结果,该实例会根据地图条目的值对其进行比较。
Entry<Client, Integer> maxEntry = Collections.max(Score.entrySet(),
new Comparator<Entry<Client, Integer>>() {
@Override
public int compare(Entry<Client, Integer> o1, Entry<Client, Integer> o2) {
return o1.getValue().compareTo(o2.getValue());
}
}
);
另外作为旁注,Java中的约定是给出以小写字母开头的变量名。
答案 1 :(得分:1)
听起来你需要Sorted Map
确保将分数用作关键字,因为地图按键而不是值排序。
答案 2 :(得分:0)
使用像TreeMap
这样的有序集合,它按照键的自然顺序保存其条目(键值映射)。因为,你想要对高分进行排序,将你的分数作为关键,将球员作为他们的价值观。
两个或更多玩家很可能拥有相同的高分。因此,我们不必将分数映射到玩家,而是将其映射到List
个玩家(具有相同的高分):
// {key - value} = {high score - {list, of, players}}
TreeMap<Integer, List<Client>> highestScores =
new TreeMap<Integer, List<Client>>();
for (Client client : getPlayers()) {
List<Client> playerList = null;
// make gameScore private
Integer score = client.getGameScore(); // using getters() recommended
// check if a player with this score already exists
if ((playerList = highestScores.get(score)) == null) { // if NOT,
playerList = new ArrayList<Client>(1); // CREATE a new list
playerList.add(client);
highestScores.put(score, playerList);
} else { // if YES, ADD to the existing list
playerList.add(client);
}
}
要迭代所有高分,请使用
for (Integer score : highestScores.descendingKeySet()) {
for (Client player : highestScores.get(score)) { // iterate over player list
System.out.println(player.getName() + ": " + score); // assuming "name" property
}
}
要直接打印出最高分,请使用
Map.Entry<Integer, List<Client>> highest = highestScores.lastEntry();
System.out.println(highest.getKey() + " : " + highest.getValue());
答案 3 :(得分:0)
创建名为maxSoFar的客户端。 在循环: 如果maxSoFar == null,请将其替换。 否则如果c.gameScore()&gt; maxSoFar.getScore() 替换maxSoFar
循环完成后,具有最高游戏核心的客户端位于maxSoFar变量中。
答案 4 :(得分:0)
在向地图添加元素时,可以保存最大值,例如:
private static void theEnd() {
int max = -Integer.MAX_VALUE;
Client winner = null;
Map<Client, Integer> Score = new HashMap<Client, Integer>();
for (Client player : getPlayers()) {
Client c = (Client) player;
Score.add(c, c.gameScore);
if( c.gameScore > max ){
max =c.gameScore;
winner = c;
}
}
}
然后按变量winner
访问获胜者。
答案 5 :(得分:0)
或者您使用TreeSet
并覆盖compareTo方法。然后,您还可以根据您的比较获取第一个或最后一个条目。基本上我更喜欢TreeMap
,而不需要额外的键或值,直接在对象上工作(冗余数据被省略)
答案 6 :(得分:0)
如果Client
类实现Comparable<Client>
并且具有如下实现:
public int compareTo(Client that) {
return Integer.compare(this.getScore(), that.getScore())
}
然后你可以使用
Client maxScoreClient = Collections.max(getPlayers());
答案 7 :(得分:0)
您已经在客户端运行,因此只需保存最高分密钥,然后您就拥有客户端:)
Map<Integer, Client> Score = new HashMap<Integer, Client>();
Integer highestScore = 0;
for (player : getPlayers()) {
Client c = (Client) player;
if(c.gameScore > highestScore ){
highestScore = c.gameScore;
}
Score.add(c.gameScore, c);
}
Client winner = score.get(highestScore );
答案 8 :(得分:0)
尝试使用不同的数据结构轻松解决您的问题。像这样:
Map<Integer, List<Client>> map = new HashMap<Integer, List<Client>>();
for (Client player : getPlayers()) {
int score = player.gameScore;
if (map.containsKey(score)) {
map.get(score).add(player);
} else {
List<Client> list = new ArrayList<Client>();
list.add(player);
map.put(score, list);
}
}
Integer max = Collections.max(map.keySet());
System.out.println(max); // Get the maximum score
System.out.println(map.get(max)); // get the list of all the players with maximum score