1

目前我正在为我的游戏编写一个聊天频道。玩家可以创建聊天频道,其他人也可以加入。这是我到目前为止所拥有的,但我不知道如何归还玩家的收藏。MultiHashMap 已被弃用,它告诉我在 commons.apache 文档上使用 MultiValueMap 。

private static MultiMap<Channel, Client> channels;

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

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

我想要做的是返回玩家的集合。这不起作用...

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

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

4

1 回答 1

0

MultiMap#get(key)方法实际上返回一个集合,但您需要强制转换它。因此,您可以获取一个频道的所有播放器,然后遍历它们以执行任何操作。

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. 一个玩家可以订阅多个频道

那么这样的事情会帮助你

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)。请注意,将地图放在静态类中并不是理想的解决方案(单例或内存缓存将是可行的方法),这只是为了让您了解我在说什么

于 2015-08-11T05:38:07.147 回答