Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите HashMap действия с ключом и значением

Korvinius

Активный участник
Пользователь
Баллы
88
Как искать в HashMap ключ, разобрался, как искать значение тоже понятно. Подскажите, как можно проверить наличие связки ключ/значение?
И еще, как можно выбрать все ключи, имеющие определенное значение?
 
Как искать в HashMap ключ, разобрался, как искать значение тоже понятно. Подскажите, как можно проверить наличие связки ключ/значение?
И еще, как можно выбрать все ключи, имеющие определенное значение?
Object v = m.get(k);
if(v != null && v.equals(nv)) return true;
 
Подскажите, как можно проверить наличие связки ключ/значение?
Например, пролистать самому for(Map.Entry<K, V> entry : hashmap.entrySet()) if(entry.getKey .... && entry.getValue ...) ...
И еще, как можно выбрать все ключи, имеющие определенное значение?
Под рукой нету IDE, опять же вполне можно пролистать самому, если containsKey() скажет, что такой ключ вообще есть.
 
Например, пролистать самому for(Map.Entry<K, V> entry : hashmap.entrySet()) if(entry.getKey .... && entry.getValue ...) ...
Под рукой нету IDE, опять же вполне можно пролистать самому, если containsKey() скажет, что такой ключ вообще есть.
Или сделать, как написал я.
 
Спасибо большое за советы, буду экспериментировать.
 
Спасибо большое за советы, буду экспериментировать.
Уже подсказали но все таки:
Лучше всего будет для ключей использовать
А для значений values().contains(o)

И еще, как можно выбрать все ключи, имеющие определенное значение?
Суть ключей в их уникальности. HashMap не может иметь 2 одинаковых ключа как минимум потому что использует для их хранения Collection.

Или сделать, как написал я.
А вот в этом логики весьма мало...
 
Уже подсказали но все таки:
Лучше всего будет для ключей использовать

А для значений values().contains(o)


Суть ключей в их уникальности. HashMap не может иметь 2 одинаковых ключа как минимум потому что использует для их хранения Collection.


А вот в этом логики весьма мало...
Логики мало у вас. Во первых, зачем эти манипуляции с values()? К тому же, вы перепутали уникальность ключей и значений.
 
Суть ключей в их уникальности. HashMap не может иметь 2 одинаковых ключа как минимум потому что использует для их хранения Collection.
Это понятно, но меня интересует именно обратное, ведь разные ключи могут иметь одинаковые значения?
так вот мне именно нужно выбрать все ключи, имеющие определенное значение.
то есть, я себе это представляю примерно так, есть следующее:

ключ1, значение1
ключ2, значение4
ключ3, значение5
ключ4, значение1
ключ5, значение4

мне из него нужно выбрать только те ключи, которые имеют например "значение1", каждый из которых, по очереди, передать в переменную, которую обработать
 
Последнее редактирование:
Это понятно, но меня интересует именно обратное, ведь разные ключи могут иметь одинаковые значения?
так вот мне именно нужно выбрать все ключи, имеющие определенное значение.
то есть, я себе это представляю примерно так, есть следующее:

ключ1, значение1
ключ2, значение4
ключ3, значение5
ключ4, значение1
ключ5, значение4

мне из него нужно выбрать только те ключи, которые имеют например "значение1", каждый из которых, по очереди, передать в переменную, которую обработать
Загоняете кейсет в фор а дальше простейшей логикой. Собственно как и уже сказали выше
 
Загоняете кейсет в фор а дальше простейшей логикой. Собственно как и уже сказали выше
Я это уже понял, просто объяснил, в ответ на предыдущий пост, спасибо.
Так, переспрошу, на всякий случай) по первой части вопроса:
проверить наличие связки ключ/значение
Java:
public boolean checkMP(String p, String ip) {
       p = v1;
      ip = v2;
        for(Map.Entry<String, String> entry : hasmap.entrySet()) {
            if(entry.getKey().equals(p) && entry.getValue().equals(ip)) {
                return true;
            }
        }
        return false;
   }
это будет работать?
 
Последнее редактирование:
Я опять вернулся к этой теме, суть в том, что мне необходимо, чтобы при залогинивании игрока, его ник и IP адрес заносились в переменную, а потом в конфиг, сделал я таким образом:
Java:
//Это должно считывать конфиг в переменную HashMap 
//при запуске плагина (включено в onEnable())
    public  void saveS(){
        try {
            YamlConfiguration cfg = new YamlConfiguration();
            for (String key : base1.keySet()){
                cfg.set(key, base1.get(key));
            }
            File f = new File (getDataFolder()+File.separator+"base1.yml");
            if (f.exists()) f.delete();
            cfg.save(f);
        } catch (Exception e){
            e.printStackTrace();
        }
    }
//Это должно сохранять переменную HashMap в конфиг 
//при отключении плагина (включено в onDisable())
    public void loadS(){
        try {
            YamlConfiguration cfg = new YamlConfiguration();
            File f = new File (getDataFolder()+File.separator+"base1.yml");
            base1.clear();
            if (f.exists()) {
                cfg.load(f);
                Set<String> keys = cfg.getKeys(false);
                if (keys.size()>0)
                    for (String key : keys)
                            base1.put(key, cfg.getString(key));
            }
        } catch (Exception e){
            e.printStackTrace();
        }
    }

Но проблема в том, что "старые" данные из конфига, или не считываются из файла при старте, или при сохранении данных в файл удаляются, при отключении), так как остаются только посление данные, те что добавились после включения сервера.

Ткните пожалуйста носом, в ошибку :oops:
 
А не являются ли для тебя проблемой серые IP (несколько игроков на одном IP) и динамические (несколько IP на один ник)? Или важно только последнее по времени значение?

P.S. Странные имена: в onEnable — save, а в onDisable — load. Обычно всё наоборот :)
 
P.S. Странные имена: в onEnable — save, а в onDisable — load. Обычно всё наоборот :)
это, я здесь, в описании перепутал)
А не являются ли для тебя проблемой серые IP (несколько игроков на одном IP) и динамические (несколько IP на один ник)? Или важно только последнее по времени значение?
Да, пытаюсь для своего проекта что то "сообразить" своими руками), мягко говоря "достали" мультиакаунты...
 
Последнее редактирование:
Java:
HashMap<String, String> base1 = new HashMap<>();
Правильно? yml вообще создаётся, или нет? Если да, что в нём? Не хочу писать и запускать у себя, ничего нет под рукой )
"старые" данные из конфига, или не считываются из файла при старте, или при сохранении данных в файл удаляются, при отключении)
Ну, и надо выяснить, что из этого на самом деле происходит =)
 
Последнее редактирование:
Java:
HashMap<String, String> base1 = new HashMap<>();
Правильно? yml вообще создаётся, или нет? Если да, что в нём? Не хочу писать и запускать у себя, ничего нет под рукой )
Ну, и надо выяснить, что из этого на самом деле происходит =)
Получается так, я залогиниваюсь на сервере, потом отключаю его, смотрю в папке есть файл в котором записан мой ник и адрес, включаю сервер снова, захожу под другим ником, потом снова смотрю файл, по идее должно быть 2 записи, разные ники с одинаковым адресом, но по факту остается только последний.
 
В консоли какие-нибудь ошибки?
Сделай вывод в консоль содержимого base1 после чтения из файла. Будет ли там что-то, или нет?
 
Сделай вывод в консоль содержимого base1 после чтения из файла. Будет ли там что-то, или нет?
Все, благодаря этому совету разобрался, причина действительно была в недоделанной заготовке getCommand, который в @Override был прописан раньше загрузки этого конфига, и который выдавал ошибки, не давая загрузиться всему. что было прописано после него, потому файл по сути не считывался.
Спасибо за помощь!
Опять я к вам за помощью :)

что мы имеем:
String p - переменная с ником игрока
String ip - переменная с адресом игрока
NoMult.instance.mult - HashMap с данными, где: key - ники, Value - адреса

нужно проверить, есть ли в "NoMult.instance.mult" совпадения с ip, но, чтобы не было совпадений с p.

я попытался реализовать это таким образом:
Java:
    public boolean checkMult(String p, String ip) {
        Map<String, String> tempmult = new HashMap<String, String>();
//        выбираем все ключи, в которых находим совпадение значений с переменной ip
//        и передаем их в переменную tempmult
        for(Map.Entry<String, String> entry : NoMult.instance.mult.entrySet()) {      
            if(entry.getValue().equals(ip)) {
                String a = entry.getKey();
                String b = entry.getValue();
                tempmult.put(a, b);          
            }
        }
//        Удаляем из переменной tempmult ключ, равный переменной p
        for(Map.Entry<String, String> entry : tempmult.entrySet()) {      
            if(entry.getKey().equals(p)) {
                tempmult.remove(p);
            }
        }
//        Проверяем не пуста ли переменная tempmult, если пуста, значит других совпадений значений ip нет, ответ false
        if (tempmult.isEmpty()) {
        return false;
        }
//        Если переменная tempmult не пуста, значит есть другие совпадения значений ip, ответ true
        return true;
    }

Вроде такой вариант должен работать?
 
Последнее редактирование:
Код:
       for(Map.Entry<String, String> entry : NoMult.instance.mult.entrySet()) {   
           if(entry.getValue().equals(ip)) {
               String a = entry.getKey();
               String b = entry.getValue();
                tempmult.put(a, b);      
           }
       }

       for(Map.Entry<String, String> entry : tempmult.entrySet()) {  
           if(entry.getKey().equals(p)) {
                tempmult.remove(p);
           }
        }
Что это за костыли? В один цикл запихнуть оба условия религия не позволяет?
 
Что это за костыли? В один цикл запихнуть оба условия религия не позволяет?
То есть как то так?
Java:
       for(Map.Entry<String, String> entry : NoMult.instance.mult.entrySet()) {   
           if(entry.getValue().equals(ip)) {
               String a = entry.getKey();
               String b = entry.getValue();
                tempmult.put(a, b);     
           }
           if(entry.getKey().equals(p)) {
                tempmult.remove(p);
           }
        }
 

Поделиться этой страницей

Назад
Верх