2017-01-02 26 views
0

对于学校我建立一个多人游戏。在这个游戏中,我有一个在大厅里的球员名单。该列表包含玩家的ID和玩家的名字。 Thoose是我的价值观。作为关键我会把大厅的关键。一起形成我正在使用的Hashmap。有没有办法得到一个整数howmany值有一个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'逻辑是相当也很遥远 - 这样,每个大厅里最多只能有一名球员。什么是“发布者”和应该是什么样的for循环?你现在试图阻止球员两次进入大堂或同时进入两个大厅吗? – luk2302

+0

您可以使用[Guava Multimap](https://github.com/google/guava/wiki/NewCollectionTypesExplained#Multimap) –

回答

0

如果你有更多的抽象,这将更容易解决和推理。如果您制作了Map<Integer, Lobby>,它将大厅ID映射到大厅,以及Player类聚合了ID和精灵名称。这将是简单的:

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

非常感谢你,我可以用这个。 –

相关问题