1
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);
    }
}

基本上,它会遍历所有客户端,并将他们的游戏分数添加到我的新地图分数中。现在,我已经准备好带有值的数组列表,并且我想在游戏中分配一个获胜者。

要成为赢家,您必须获得最高分。

我的问题:

如何在地图集合中找到最高的游戏分数?

4

9 回答 9

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 中的约定是以小写字母开头的变量名称。

于 2013-08-09T11:04:27.967 回答
1

听起来你需要一个排序地图

确保使用分数作为键,因为地图是按键而不是值排序的。

于 2013-08-09T11:06:19.180 回答
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());
于 2013-08-09T11:03:05.280 回答
0

创建一个名为 maxSoFar 的客户端。在循环中:如果 maxSoFar == null,则替换它。else if c.gameScore() > maxSoFar.getScore() 替换 maxSoFar

循环完成后,游戏得分最高的客户端位于 maxSoFar 变量中。

于 2013-08-09T11:04:33.400 回答
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

于 2013-08-09T11:06:44.763 回答
0

或者您使用 aTreeSet并覆盖 compareTo 方法。然后,您还可以根据您的比较获取第一个或最后一个条目。基本上我更喜欢它,TreeMap因为您不需要额外的键或值并直接在对象上工作(省略了冗余数据)

于 2013-08-09T11:10:20.633 回答
0

如果Client该类实现Comparable<Client>并具有这样的实现:

public int compareTo(Client that) {
     return Integer.compare(this.getScore(), that.getScore())
}

然后你可以使用

Client maxScoreClient = Collections.max(getPlayers());
于 2013-08-09T11:10:29.443 回答
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 );
于 2013-08-09T11:12:32.287 回答
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
于 2013-08-09T11:17:48.753 回答