Как работать с MultiValueMap
В настоящее время я пишу канал чата для моей игры. Игроки могут создавать каналы чата, и другие могут присоединиться к нему. Это то, что я имею до сих пор, но я не знаю, как вернуть коллекцию игроков. MultiHashMap устарела, и он сказал мне использовать MultiValueMap вместо этого в документах commons.apache.
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 для значения, которое не то, что мне нужно. Если есть лучшая альтернатива, пожалуйста, дайте мне знать.
1 ответ
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
который должен содержать отображение каналов и игроков, но новая карта будет создаваться с каждым новым каналом.
Если то, что вы хотите достичь, это
- Канал может иметь несколько клиентских игроков
- Игрок может подписаться на несколько каналов
тогда что-то подобное поможет вам
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)
, Обратите внимание, что наличие карты в статическом классе не является идеальным решением (единственное место или кэш в памяти - это то, что нужно), а просто дает представление о том, о чем я говорю