ArrayList - 获取最高的int值?

时间:2013-08-09 11:00:46

标签: java collections map

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准备好了价值观,我想在比赛中指定一名获胜者。

要成为胜利者,您必须获得最高分。

我的问题:

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

9 个答案:

答案 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