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

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

То есть как то так?
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);
           }
        }
О боже, зачем вставлять строку, а потом удалять её? Попробуйте включить голову.
 
О боже, зачем вставлять строку, а потом удалять её? Попробуйте включить голову.
:oops: попытаюсь:
Java:
       for(Map.Entry<String, String> entry : NoMult.instance.mult.entrySet()) {  
           if(entry.getValue().equals(ip) && !entry.getKey().eguals(p)) {
               String a = entry.getKey();
               String b = entry.getValue();
                tempmult.put(a, b);   
           }
        }
 
:oops: попытаюсь:
Java:
       for(Map.Entry<String, String> entry : NoMult.instance.mult.entrySet()) { 
           if(entry.getValue().equals(ip) && !entry.getKey().eguals(p)) {
               String a = entry.getKey();
               String b = entry.getValue();
                tempmult.put(a, b);  
           }
        }
Браво! Теперь надо вынести переменные за условие чтобы не использовать их зря.
 
Прошу совета еще по одному вопросу:
есть 3 переменные HashMap - hashmap1, hashmap2, hashmap3. Нужно в hashmap1 по порядку выбирать все значения (value1), получать по ним ключи и проверить наличие этих ключей в hashmap2 и hashmap3.

Как это лучше и правильнее организовать?
Я пробовал это сделать так:
Java:
    public boolean hasCheck(String m, String n, String l) {
        String c = null;
        for(Map.Entry<String, String> entry : itemsm1.entrySet()) {
            if (entry.getValue().equals(m)) {
                c = entry.getKey();
                for(Map.Entry<String, String> entry2 : itemsm2.entrySet()) {
                    if (entry2.getKey().equals(c)) {
                        for(Map.Entry<String, String> entry3 : itemsm2.entrySet()) {
                            if (entry3.getKey().equals(c)) {
                                return true;
                            }
                        }
                    }
                }
            }
        }
        return false;
    }
но, судя по всему, я делаю что то совсем не то, так как результат всегда false.
 
Прошу совета еще по одному вопросу:
есть 3 переменные HashMap - hashmap1, hashmap2, hashmap3. Нужно в hashmap1 по порядку выбирать все значения (value1), получать по ним ключи и проверить наличие этих ключей в hashmap2 и hashmap3.

Как это лучше и правильнее организовать?
Я пробовал это сделать так:
JavaScript:
    public boolean hasCheck(String m, String n, String l) {
        String c = null;
        for(Map.Entry<String, String> entry : itemsm1.entrySet()) {
            if (entry.getValue().equals(m)) {
                c = entry.getKey();
                for(Map.Entry<String, String> entry2 : itemsm2.entrySet()) {
                    if (entry2.getKey().equals(c)) {
                        for(Map.Entry<String, String> entry3 : itemsm2.entrySet()) {
                            if (entry3.getKey().equals(c)) {
                                return true;
                            }
                        }
                    }
                }
            }
        }
        return false;
    }
но, судя по всему, я делаю что то совсем не то, так как результат всегда false.
У Map есть метод containsKey()
 
У Map есть метод containsKey()
пробовал еще раньше это:
Java:
    public boolean isCheck(String m) {
        String c = null;
        for(Map.Entry<String, String> entry : itemsm1.entrySet()) {
            if (entry.getValue().equals(m)) {
                c = entry.getKey();
                if (itemsm2.containsKey(c)) {
                    if (itemsm3.containsKey(c)) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
результат такой же.
 
пробовал еще раньше это:
Java:
    public boolean isCheck(String m) {
        String c = null;
        for(Map.Entry<String, String> entry : itemsm1.entrySet()) {
            if (entry.getValue().equals(m)) {
                c = entry.getKey();
                if (itemsm2.containsKey(c)) {
                    if (itemsm3.containsKey(c)) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
результат такой же.
А такие ключи есть в мапе? Посмотрите в отладчике.
 
хотя нет, там было немного по другому, здесь я чуть подправил, пойду перепроверю
 
Java:
    public boolean isCheck(String m) {
        String c = null;
        for(Map.Entry<String, String> entry : itemsm1.entrySet()) {
            if (entry.getValue().equals(m)) {
                c = entry.getKey();
                if (itemsm2.containsKey(c)) {
                    if (itemsm3.containsKey(c)) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
Код выглядит рабочим, нужно проверять входные данные. Я бы только определял переменную c в более узкой области видимости. А зачем нужна такая логика? Нельзя сделать проще.
 
Код выглядит рабочим, нужно проверять входные данные. Я бы только определял переменную c в более узкой области видимости. А зачем нужна такая логика? Нельзя сделать проще.
да наверное можно и проще, это как бы экспериментирую... Пытаюсь найти оптимальное решение для одной старой идеи)))
А зачем нужна такая логика?
Может подскажете, как организовать проверку предметов, по Material, DisplayName, Lore и при этом учесть возможное отсутствие у предмета DisplayName и/или Lore?
 
Последнее редактирование:
Может подскажете, как организовать проверку предметов, по Material, DisplayName, Lore и при этом учесть возможное отсутствие у предмета DisplayName и/или Lore?
Если DisplayName/Lore нету, это означает попадание предмета в нужную категорию, или наоборот — они должны быть и должны быть определёнными?
if(item.getMaterial().equals(Material.КАКОЙ-ТО) && "Нужный DN".equals(item.getDisplayName()) && "Нужный Lore".equals(item.getLore()) { ... }
Извини, пишу на псевдо языке, нет IDE под рукой.
 
Если DisplayName/Lore нету, это означает попадание предмета в нужную категорию, или наоборот — они должны быть и должны быть определёнными?
if(item.getMaterial().equals(Material.КАКОЙ-ТО) && "Нужный DN".equals(item.getDisplayName()) && "Нужный Lore".equals(item.getLore()) { ... }
Извини, пишу на псевдо языке, нет IDE под рукой.
нет, это я знаю, я имел ввиду другое, смысл в том, что есть конфиг, в котором данные, чтобы проще, примерно так:
Код:
xxx1:
    material: xxx
    DP: xxx
    Lore: xxx
xxx2:
    material: xxx
    DP: xxx
    Lore: xxx
xxx3:
    material: xxx
    DP: xxx
    Lore: xxx
так я имею ввиду, каким образом лучше обрабатывать их для сравнения? Пробовал склеивать все в одну строку: (material+DP+Lore), передать в HashSet и сравнивать с нужным, пробовал делать три переменных hashMap, где ключ: key=хешкод от (material+DP+Lore), общий для всех переменных, а значение, первый hashMap: value=material, второй hashMap: value=DP, третий hashMap: value=Lore. Но такой вариант мне кажется лишний и не нужный, вот и думаю, как лучше это организовать...
 
Будем честными, до тех пор пока кол-во данных для сравнения меньше нескольких миллионов - сравнивайте как вам удобно.
 
Будем честными, до тех пор пока кол-во данных для сравнения меньше нескольких миллионов - сравнивайте как вам удобно.
20 тиков в секунду = по 50ms на 1 тик. Думаешь 50ms хватит на все прочие дела сервера и на пол ляма сравнений?

нет, это я знаю, я имел ввиду другое, смысл в том, что есть конфиг, в котором данные, чтобы проще, примерно так:
Код:
xxx1:
    material: xxx
    DP: xxx
    Lore: xxx
xxx2:
    material: xxx
    DP: xxx
    Lore: xxx
xxx3:
    material: xxx
    DP: xxx
    Lore: xxx
так я имею ввиду, каким образом лучше обрабатывать их для сравнения? Пробовал склеивать все в одну строку: (material+DP+Lore), передать в HashSet и сравнивать с нужным, пробовал делать три переменных hashMap, где ключ: key=хешкод от (material+DP+Lore), общий для всех переменных, а значение, первый hashMap: value=material, второй hashMap: value=DP, третий hashMap: value=Lore. Но такой вариант мне кажется лишний и не нужный, вот и думаю, как лучше это организовать...

Ребят, нужно читать умные книжечки по программировани: книжечки по Java (чтобы знать как работают самые простые вещи) и книжечки по ООП (чтобы в программе фигурировали объекты и классы, а не вложенные Map'ы в друг дружку).

Без лишних итераций, без лишних функций, самая быстрая проверка соответсвия одного объекта куче других объектов:
https://gist.github.com/ptnkjke/aa79039e475f95c2fa06
 
Вот, камрад выше дельный код показал. Плюсую ему.
 

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

Назад
Верх