Помогите Как лучше сделать? HashMap and for

_MasterCapeXD_

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
_MasterCapeXD_
Вообщем, мне нужно, чтобы я получал игрока из мапы, игрок - ключ, получение методов из определенного игрока из мапы я реализовал так:

PHP:
    static HashMap<Player, Long> mutedplayers = new HashMap<Player, Long>();
    
    static void unmute(Player player)
    {
        mutedplayers.remove(player);
    }
    
    static void mute(Player player, long time)
    {
        mutedplayers.put(player, time);
    }
    
    private long getTimePassed(Player player)
    {
        return System.currentTimeMillis() - mutedplayers.get(player);
    }
    
    private boolean isPassed(Player player)
    {
        return this.getTimePassed(player) >= mutedplayers.get(player);
    }
    
    @EventHandler
    public void on(AsyncPlayerChatEvent e)
    {
        Player player = e.getPlayer();
        String name = player.getName();
        
        if(e.isCancelled()) return;
        for(Player oneplayer : mutedplayers.keySet())
        {
            if(isPassed(oneplayer))
            {
                unmute(oneplayer);
                if((oneplayer == null) || (!oneplayer.isOnline()))
                {
                    return;
                }
                oneplayer.sendMessage(instance.getConfig().getString("slo.you-are-unmuted").replace("&", "\u00a7")); return;
            }
        }

Но мне этот способ не очень нравится, есть ли другие способы?
 
мдаору
Код:
if(mutedplayers.containsKey(player) && isPassed(player)) {
//paste u govnocode here
}
 
Последнее редактирование:
Чувак явно не понимает разницы мапы от листа 😁. Аж под стол упал от for(...)
 
мдаору
Код:
if(mutedplayers.containsKey(player) && isPassed(player)) {
//do something
}
Возможно я чуть не понимаю логики работы HashMap, но мне нужно получать отдельного игрока из мапы... Хотя, все-равно я это делаю в ивенте. Кстати, этот пример у меня раньше был, но муты выдавались некорректно, по-этому пробовал по-другому.

PS: Никогда больше не буду задавать подобные вопросы на RuBukkit (именно вопросы по классам Java). Советов мало, а ОРА ВЫШЕ ГОР. Пойду на stackoverflow или другие подобные платформы, там хоть обьясняют адекватно.
 
Возможно я чуть не понимаю логики работы HashMap, но мне нужно получать отдельного игрока из мапы... Хотя, все-равно я это делаю в ивенте. Кстати, этот пример у меня раньше был, но муты выдавались некорректно, по-этому пробовал по-другому.

PS: Никогда больше не буду задавать подобные вопросы на RuBukkit (именно вопросы по классам Java). Советов мало, а ОРА ВЫШЕ ГОР. Пойду на stackoverflow или другие подобные платформы, там хоть обьясняют адекватно.
Там не адекватнее, так что лучше изучай документацию
 
Код:
  @EventHandler
  public void onManyGovnocode(AsyncPlayerChatEvent e) {
        if(e.isCancelled()) return;

      Player player = e.getPlayer();
       if(mutedplayers.contains(player) && isPassed(player)) {
        unmute(player);
        player.sendMessage(instance.getConfig().getString("slo.you-are-unmuted").replace("&", "§")); return;
    }
   }
 
map.keySet().stream().filter(this::isPassed).collect(Collectors.toSet()).forEach(this::unmute);
 
PS: Никогда больше не буду задавать подобные вопросы на RuBukkit (именно вопросы по классам Java). Советов мало, а ОРА ВЫШЕ ГОР. Пойду на stackoverflow или другие подобные платформы, там хоть обьясняют адекватно.
Это самый адекватный вариант.
Это именно то, что я имел ввиду. Спасибо
Тебя троллят. У HashMap ~ O(1) поиск по ключу, метод get().

P.S. Прошу прощения, я поспешил и не заметил, что нужно обработать всех игроков. Тогда норм вариант. Но я бы ещё сократил на дополнительном обращении к карте:
Java:
final long now = System.currentTimeMillis();
map.entrySet()
   .stream()
   .filter(e -> now - e.getValue() > КАКАЯ_ТО_КОНСТАНТА)
   .map(e -> e.getKey())
   .forEach(this::unmute);
Константу ввёл, т.к. из первого поста не ясно, что именно хранится в карте — момент начала мьюта (исходил из него), или его длительность.
 
Последнее редактирование:
Это самый адекватный вариант.

Тебя троллят. У HashMap ~ O(1) поиск по ключу, метод get().

P.S. Прошу прощения, я поспешил и не заметил, что нужно обработать всех игроков. Тогда норм вариант. Но я бы ещё сократил на дополнительном обращении к карте:
Java:
final long now = System.currentTimeMillis();
map.entrySet()
   .stream()
   .filter(e -> now - e.getValue() > КАКАЯ_ТО_КОНСТАНТА)
   .map(e -> e.getKey())
   .forEach(this::unmute);
Константу ввёл, т.к. из первого поста не ясно, что именно хранится в карте — момент начала мьюта (исходил из него), или его длительность.
Вот почему так мало адекватных пользователей... Я не против чуть поржать, но когда после опубликовки темы сидишь в ожидании "ОРУ" "ЛОЛ" "Операцию на глаза оплатишь" "Садить надо за такой код" - невероятно роздражает. Чем дальше, тем больше пользователей потеряли обычную человечность, многие просто не видят черты между приемлемым и некультурным.

Очень рад, что все таки есть такие как: Reality_SC, Dereku, которые хотя и имеют авторитет, но не злоупотребляют им.

PS: Спасибо за хороший ответ со всей необходимой информацией.
 
Назад
Верх