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