2017-01-02 2 views
0

Для школы я создаю многопользовательскую игру. В этой игре у меня есть список игроков в холле. Этот список содержит идентификатор игрока и имя пользователя игрока. Thoose - мои ценности. В качестве ключа я поставлю ключ в лобби. вместе с формой Hashmap, с которой я работаю.Есть ли способ получить целое число на сколько значений есть в хэш-карте с тем же ключом?

Когда я хочу подключиться к лобби, я должен знать, есть ли у игрока allready в hashmap, поэтому мне нужен цикл foreach, чтобы проверить это. Но я не знаю, как это сделать или даже если это возможно.

private HashMap<Integer, List<String>> playersInLobby; 

public IRemotePublisherForListener connect(int playerID, String spriteName, int lobbyID) 
{ 
    boolean found = false; 
    for (int i = 0; playersInLobby.containsKey(lobbyID);) 
    { 
     if (playersInLobby.get(lobbyID).get(0) == playerID + "") 
     { 
      found = true; 
     } 
    } 
    if (!found) 
    { 
     playersInLobby.put(lobbyID, new ArrayList<>(Arrays.asList(playerID + "", spriteName))); 
    } 
    return publisher; 
} 
+4

'значения в HashMap с одинаковым key', только 1. Вы не можете иметь дубликат ключа в HashMap, то есть точка;) – AxelH

+1

Ваш' put'-логика вполне далеко также - таким образом, в каждом лобби может быть только не более одного игрока. И что такое 'издатель' и какой из циклов должен быть? Вы сейчас пытаетесь помешать игрокам находиться в фойе дважды или быть в двух лобби одновременно? – luk2302

+0

Вы можете использовать [Guava Multimap] (https://github.com/google/guava/wiki/NewCollectionTypesExplained#Multimap) для ваших целей. –

ответ

0

Это было бы проще решить и обосновать, если бы у вас было больше абстракции. Если вы сделали Map<Integer, Lobby>, который отображает идентификаторы лобби в лобби, а также класс Player, который объединяет имя и имя спрайта. Было бы просто:

private final Map<Integer, Lobby> lobbiesByID; 

private boolean isPlayerInLobby(Player player) { 
    return lobbiesByID.values().stream().anyMatch(l -> l.hasPlayer(player)); 
} 

public IRemotePublisherForListener connect(Player player, int lobbyID) { 
    if(!isPlayerInLobby(player)) { 
     //.. insert null-check unless you trust the id 
     lobbiesByID.get(lobbyID).addPlayer(player); 
    } 
    //.. else, log an error, or throw 
    return publisher; 
} 
+0

Большое спасибо, я могу использовать это. –