Как работать с 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 который должен содержать отображение каналов и игроков, но новая карта будет создаваться с каждым новым каналом.

Если то, что вы хотите достичь, это

  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), Обратите внимание, что наличие карты в статическом классе не является идеальным решением (единственное место или кэш в памяти - это то, что нужно), а просто дает представление о том, о чем я говорю

Другие вопросы по тегам