Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Dismiss Notice

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

Discussion in 'Разработка плагинов для новичков' started by Korvinius, Dec 21, 2014.

  1. Автор темы
    Korvinius

    Korvinius Активный участник Пользователь

    Trophy Points:
    88
    Как искать в HashMap ключ, разобрался, как искать значение тоже понятно. Подскажите, как можно проверить наличие связки ключ/значение?
    И еще, как можно выбрать все ключи, имеющие определенное значение?
     
  2. Хостинг MineCraft
    <
  3. serega6531

    serega6531 Старожил Девелопер Пользователь

    Trophy Points:
    173
    Skype:
    shkurovs
    Object v = m.get(k);
    if(v != null && v.equals(nv)) return true;
     
  4. Reality_SC

    Reality_SC Старожил Пользователь

    Trophy Points:
    123
    Имя в Minecraft:
    Reality_SC
    Например, пролистать самому for(Map.Entry<K, V> entry : hashmap.entrySet()) if(entry.getKey .... && entry.getValue ...) ...
    Под рукой нету IDE, опять же вполне можно пролистать самому, если containsKey() скажет, что такой ключ вообще есть.
     
  5. serega6531

    serega6531 Старожил Девелопер Пользователь

    Trophy Points:
    173
    Skype:
    shkurovs
    Или сделать, как написал я.
     
  6. Автор темы
    Korvinius

    Korvinius Активный участник Пользователь

    Trophy Points:
    88
    Спасибо большое за советы, буду экспериментировать.
     
  7. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Trophy Points:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Уже подсказали но все таки:
    Лучше всего будет для ключей использовать
    А для значений values().contains(o)

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

    А вот в этом логики весьма мало...
     
  8. serega6531

    serega6531 Старожил Девелопер Пользователь

    Trophy Points:
    173
    Skype:
    shkurovs
    Логики мало у вас. Во первых, зачем эти манипуляции с values()? К тому же, вы перепутали уникальность ключей и значений.
     
  9. Автор темы
    Korvinius

    Korvinius Активный участник Пользователь

    Trophy Points:
    88
    Это понятно, но меня интересует именно обратное, ведь разные ключи могут иметь одинаковые значения?
    так вот мне именно нужно выбрать все ключи, имеющие определенное значение.
    то есть, я себе это представляю примерно так, есть следующее:

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

    мне из него нужно выбрать только те ключи, которые имеют например "значение1", каждый из которых, по очереди, передать в переменную, которую обработать
     
    Last edited: Dec 22, 2014
  10. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Trophy Points:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Загоняете кейсет в фор а дальше простейшей логикой. Собственно как и уже сказали выше
     
  11. Автор темы
    Korvinius

    Korvinius Активный участник Пользователь

    Trophy Points:
    88
    Я это уже понял, просто объяснил, в ответ на предыдущий пост, спасибо.[DOUBLEPOST=1419201156,1419200431][/DOUBLEPOST]Так, переспрошу, на всякий случай) по первой части вопроса:
    Code:
    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;
       }
    
    это будет работать?
     
    Last edited: Dec 22, 2014
  12. Reality_SC

    Reality_SC Старожил Пользователь

    Trophy Points:
    123
    Имя в Minecraft:
    Reality_SC
    Да, вполне, нормальная логика.
     
  13. Автор темы
    Korvinius

    Korvinius Активный участник Пользователь

    Trophy Points:
    88
    Я опять вернулся к этой теме, суть в том, что мне необходимо, чтобы при залогинивании игрока, его ник и IP адрес заносились в переменную, а потом в конфиг, сделал я таким образом:
    Code:
    //Это должно считывать конфиг в переменную 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:
     
  14. Reality_SC

    Reality_SC Старожил Пользователь

    Trophy Points:
    123
    Имя в Minecraft:
    Reality_SC
    А не являются ли для тебя проблемой серые IP (несколько игроков на одном IP) и динамические (несколько IP на один ник)? Или важно только последнее по времени значение?

    P.S. Странные имена: в onEnable — save, а в onDisable — load. Обычно всё наоборот :)
     
  15. Автор темы
    Korvinius

    Korvinius Активный участник Пользователь

    Trophy Points:
    88
    это, я здесь, в описании перепутал)[DOUBLEPOST=1419523923,1419523079][/DOUBLEPOST]
    Да, пытаюсь для своего проекта что то "сообразить" своими руками), мягко говоря "достали" мультиакаунты...
     
    Last edited: Dec 25, 2014
  16. Reality_SC

    Reality_SC Старожил Пользователь

    Trophy Points:
    123
    Имя в Minecraft:
    Reality_SC
    Code:
    HashMap<String, String> base1 = new HashMap<>();
    Правильно? yml вообще создаётся, или нет? Если да, что в нём? Не хочу писать и запускать у себя, ничего нет под рукой )
    Ну, и надо выяснить, что из этого на самом деле происходит =)
     
    Last edited: Dec 25, 2014
  17. Автор темы
    Korvinius

    Korvinius Активный участник Пользователь

    Trophy Points:
    88
    Получается так, я залогиниваюсь на сервере, потом отключаю его, смотрю в папке есть файл в котором записан мой ник и адрес, включаю сервер снова, захожу под другим ником, потом снова смотрю файл, по идее должно быть 2 записи, разные ники с одинаковым адресом, но по факту остается только последний.
     
  18. Reality_SC

    Reality_SC Старожил Пользователь

    Trophy Points:
    123
    Имя в Minecraft:
    Reality_SC
    В консоли какие-нибудь ошибки?
    Сделай вывод в консоль содержимого base1 после чтения из файла. Будет ли там что-то, или нет?
     
  19. Автор темы
    Korvinius

    Korvinius Активный участник Пользователь

    Trophy Points:
    88
    Все, благодаря этому совету разобрался, причина действительно была в недоделанной заготовке getCommand, который в @Override был прописан раньше загрузки этого конфига, и который выдавал ошибки, не давая загрузиться всему. что было прописано после него, потому файл по сути не считывался.
    Спасибо за помощь![DOUBLEPOST=1419629503,1419541994][/DOUBLEPOST]Опять я к вам за помощью :)

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

    я попытался реализовать это таким образом:
    Code:
      
        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;
        }
    Вроде такой вариант должен работать?
     
    Last edited: Dec 27, 2014
  20. serega6531

    serega6531 Старожил Девелопер Пользователь

    Trophy Points:
    173
    Skype:
    shkurovs
    Code:
           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);
               }
            }
    Что это за костыли? В один цикл запихнуть оба условия религия не позволяет?
     
  21. Автор темы
    Korvinius

    Korvinius Активный участник Пользователь

    Trophy Points:
    88
    То есть как то так?
    Code:
           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);
               }
            }
     

Share This Page