如何使用MultiValueMap

时间:2015-08-10 14:37:11

标签: java apache-commons-collection

目前我正在为我的游戏写一个聊天频道。玩家可以创建聊天频道,其他人可以加入。这是我到目前为止,但我不知道如何返回球员的集合。不推荐使用MultiHashMap,它告诉我在commons.apache文档中使用MultiValueMap。

=Parameters!YourParameter.Value(Globals!PageNumber-1)

现在在我的构造函数中它创建了通道

private static MultiMap<Channel, Client> channels;

我想做的就是归还玩家的集合。这不起作用......

    public Channel(Client owner) {
        this.owner = owner;
        channels = new MultiValueMap<>();
    }

帮助表示赞赏。我尝试使用MultiKeyMap,但问题是我无法创建频道,除非他们为密钥选择2个参数,而1代表我不需要的值。如果有更好的选择,请告诉我。

1 个答案:

答案 0 :(得分:0)

MultiMap#get(key)方法实际上返回了一个Collection,但你需要强制转换它。所以你可以获得一个频道的所有玩家,然后迭代它们来执行任何操作。

Collection<Client> players = (Collection<Client>)channels.get(channel);
for (Client player : players) {
   player.bla();
}

但是,我不太了解您的数据模型。创建方法

public static boolean create(Client player) {
    Channel channel = new Channel(player);
    channels.get(channel).get(player).bla();
    return true;
}

创建新的Channel,但不会将其添加到地图中。此外,Channel构造函数正在创建一个static MultiMap,它应该保存通道和玩家的映射,但是每个新通道都会创建一个新的地图。

如果你想要实现的目标是

  1. 频道可以有多个客户端播放器
  2. 玩家可以订阅多个频道
  3. 然后这样的事情可以帮助你

    public PlayerChannelMap {
        public static final MultiMap<Player, Channel> map = new MultiValueMap<>();
    }
    
    public Channel {
    
        private List<Client> players = new ArrayList<>();
    
        public addPlayer(Client player) {
            players.add(player);
            PlayerChannelMap.map.put(player, this));
        }
    
        public List<Client> getPlayers() {
           return players;
        }
    }
    

    您的应用程序只有一个MultiMap<Player, Channel> map。您可以channel.getPlayers()从频道中获取所有播放器,并通过(Collection<Channel>)PlayerChannelMap.map.get(player)从地图中获取播放器的所有频道。请注意,将地图放在静态类中并不是理想的解决方案(单例或内存缓存是可行的方法)而且只是想知道我在说什么