2013-08-09 3 views
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); 
    } 
} 

В основном, он проходит через всех клиентов и добавляет свой игровой счет в мой новый показатель карты. Теперь у меня есть arraylist, готовый со значениями, и я хочу назначить победителя в игре.ArrayList - получить наивысшую стоимость int?

Чтобы стать победителем, вы должны иметь самый высокий балл.

Мой вопрос:

Как я могу найти самый высокий балл игры в коллекции карты?

+1

Этот код даже не компилируется. Вам не хватает ссылочного типа для переменной цикла. –

+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 должно давать имена переменных, начинающиеся с строчной буквы.

+0

Дело в том, что мне нужно знать, чего Клиент достиг. –

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()); 
0

Сделать клиента под названием maxSoFar. В цикле: Если maxSoFar == null, замените его. еще если c.gameScore()> maxSoFar.getScore() заменить maxSoFar

Когда цикл закончен, клиент с самым высоким gamescore в переменной maxSoFar.

1

Похоже, вам нужен Sorted Map

Убедитесь использовать счет в качестве ключа, потому что карта отсортирован по ключам, а не значений.

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.

0

Или вы используете TreeSet и переопределите метод compareTo.Затем вы можете также взять первую или последнюю запись на основе вашего сравнения. В основном я предпочитаю, чтобы над TreeMap как вам не нужно дополнительный ключ или значение и работать непосредственно на объекте (избыточные данные опущены)

0

Если Client класс реализует Comparable<Client> и имеет реализацию, как это:

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

Тогда вы могли бы использовать

Client maxScoreClient = Collections.max(getPlayers()); 
0

ваш уже работает корыта клиентов, чтобы просто сохранить higest ключ вратаря, а затем у вас есть клиент :)

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); 
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 
Смежные вопросы