Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用多值映射_Java_Apache Commons Collection - Fatal编程技术网

Java 如何使用多值映射

Java 如何使用多值映射,java,apache-commons-collection,Java,Apache Commons Collection,目前我正在为我的游戏编写一个聊天频道。玩家可以创建聊天频道,其他人也可以加入。这是我到目前为止所拥有的,但我不知道如何归还收集的球员。MultiHashMap已被弃用,它告诉我在commons.apache文档中使用MultiValueMap private static MultiMap<Channel, Client> channels; 谢谢你的帮助。我尝试使用MultiKeyMap,但问题是我无法创建通道,除非它们为键使用2个参数,为值使用1个参数,这不是我需要的。如果有更

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

private static MultiMap<Channel, Client> channels;
谢谢你的帮助。我尝试使用MultiKeyMap,但问题是我无法创建通道,除非它们为键使用2个参数,为值使用1个参数,这不是我需要的。如果有更好的选择,请告诉我。

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

Collection<Client> players = (Collection<Client>)channels.get(channel);
for (Client player : players) {
   player.bla();
}
创建新的
频道
,但不将其添加到地图中。此外,
频道
构造函数正在创建一个
静态多贴图
,该贴图应该保存频道和玩家的贴图,但每个新频道都会创建一个新贴图

如果你想实现的是这个

  • 一个频道可以有多个客户端播放器
  • 一个播放器可以订阅多个频道
  • 那么像这样的东西会对你有帮助

    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;
        }
    }
    
    公共播放频道地图{
    公共静态最终多值映射=新的多值映射();
    }
    公共频道{
    private List players=new ArrayList();
    公共addPlayer(客户端播放器){
    players.add(player);
    playerChannel map.map.put(player,this));
    }
    公共列表getPlayers(){
    返回球员;
    }
    }
    
    其中,您有一个应用程序的单个
    多贴图。您可以通过
    channel.getPlayers()
    从一个频道获取所有播放机,通过
    (集合)PlayerChannelMap.map.get(播放机)
    从地图获取播放机的所有频道。请注意,将映射放在静态类中并不是理想的解决方案(单例或内存缓存将是最好的选择),它只是让您了解一下我要说的内容。多映射#get(key)
    方法实际上返回一个集合,但您需要强制转换它。因此,您可以获取一个频道的所有播放机,然后对它们进行迭代以执行任何操作

    Collection<Client> players = (Collection<Client>)channels.get(channel);
    for (Client player : players) {
       player.bla();
    }
    
    创建新的
    频道
    ,但不将其添加到地图中。此外,
    频道
    构造函数正在创建一个
    静态多贴图
    ,该贴图应该保存频道和玩家的贴图,但每个新频道都会创建一个新贴图

    如果你想实现的是这个

  • 一个频道可以有多个客户端播放器
  • 一个播放器可以订阅多个频道
  • 那么像这样的东西会对你有帮助

    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;
        }
    }
    
    公共播放频道地图{
    公共静态最终多值映射=新的多值映射();
    }
    公共频道{
    private List players=new ArrayList();
    公共addPlayer(客户端播放器){
    players.add(player);
    playerChannel map.map.put(player,this));
    }
    公共列表getPlayers(){
    返回球员;
    }
    }
    

    其中,您有一个应用程序的单个
    多贴图。您可以通过
    channel.getPlayers()
    从一个频道获取所有播放机,通过
    (集合)PlayerChannelMap.map.get(播放机)
    从地图获取播放机的所有频道。请注意,将映射放在静态类中并不是理想的解决方案(单例缓存或内存缓存将是最好的选择),它只是让您了解我所说的内容

    尝试将
    .get(channel).get(player).bla()
    行拆分为单独的行,以帮助查看您在其中实际执行的操作。还需要注意的是,您正在从实例上下文(即从构造函数)分配静态字段。这几乎总是一个错误。@MarkPeters谢谢你的评论。#get(player)不接受player对象,它需要一个数字值,但问题是我需要检查索引,这会使我的生活更加困难。为什么你要在
    客户端上调用
    bla()
    ,而不是调用传入参数?如果您试图让播放机使用正确的频道,为什么不通过
    channels.get(channel).contains(player)
    测试每个频道中的参数呢?你也可以考虑一个不同的数据结构,它不需要一个虚拟通道来进行查找和潜在的哑<代码>客户机>代码>查找。@ PaulBilnoski <代码> BRAAL()/CODE >只是客户端类中的一个测试方法。我想检索播放器并执行该方法。使用
    channels.get(channel.get(player)
    不可能。是否有其他地图可以返回我的players集合?例如,像
    channels.get(channel.getPlayer().bla()
    这样的东西也会让我的生活更轻松。试着把
    .get(channel.get(player.bla()
    行拆分成单独的行,以帮助查看您实际上在做什么。还需要注意的是,您正在从实例上下文(即从构造函数)分配静态字段。这几乎总是一个错误。@MarkPeters谢谢你的评论。#get(player)不接受player对象,它需要一个数字值,但问题是我需要检查索引,这会使我的生活更加困难。为什么你要在
    客户端上调用
    bla()
    ,而不是调用传入参数?如果您试图让播放机使用正确的频道,为什么不通过
    channels.get(channel).contains(player)
    测试每个频道中的参数呢?你也可以考虑一个不同的数据结构,它不需要一个虚拟通道来进行查找和潜在的哑<代码>客户机>代码>查找。@ PaulBilnoski <代码> BRAAL()/CODE >只是客户端类中的一个测试方法。我想检索播放器并执行该方法。使用
    频道是不可能的。获取(频道)。获取(播放器)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;
        }
    }