HashMap <UUID, ArrayList <>>, arrayylist не будет хранить значения

У меня есть хэш-карта типа HashMap<UUID,ArrayList<util.Package>>. Хэш-карта работает нормально, но ArrayList не сохраняет. Я могу добавлять к нему элементы, но они там не сохраняются.

util.Package - это тип перечисления с парой перечислений внутри.

Я пробовал разные способы добавления (прямо через карту: hashMapName.get(uuid).add(util.Package.TYPE) и получая объект, удаляя его с карты, добавляя к нему, затем возвращая). Ни один из них не работал.

присоединиться к мероприятию: loadAndCoins.newPlayer(e.getPlayer().getUniqueId());

loadAndCoins.newPlayer ():

public static boolean newPlayer(UUID uuid) {
    if (!balances.containsKey(uuid)) {
        balances.put(uuid, 0);
        experience.put(uuid, 
        GameStats.createNewPlayer(uuid);
        Packages.newPlayer(uuid); // this is the line that creates  
        return true;
    }
    return false;
}

Packages.newPlayer ():

public static void newPlayer(UUID uuid) {
    ArrayList<util.Package> n = new ArrayList<util.Package>();
    n.add(util.Package.JMSG_DEFAULT);
    System.out.println("NEW: " + n); // debug, has JMSG_DEFAULT
    Packs.put(uuid, n);
}

Packages.addPackage (): (Добавить пакет в uuid)

public static boolean addPackage(UUID uuid,util.Package pack) {
    if (!Packs.containsKey(uuid)) return false;
    if (!Packs.get(uuid).contains(pack)) {
        ArrayList<util.Package> op = Packs.get(uuid);
        op.add(pack);
        Packs.remove(uuid);
        Packs.put(uuid, op);
        System.out.println("ADDPACKAGE: " + op);  
                    // has DEFAULT and the added package
        return true;
    } return false;
}

Packages.hasPackage (): (Используется для проверки наличия у uuid пакета)

public static boolean hasPackage(UUID uuid,util.Package pack) {
    if (!Packs.containsKey(uuid)) return false;
    System.out.println(Packs.toString()); //has only DEFAULT.
    if (Packs.get(uuid).contains(pack)) return true;
    return false;
}

Ожидал: Первый вызов addPackage (uuid, Package.JMSG_FESTIVE), затем вызов hasPackage (uuid, Package.JMSG_FESTIVE) вернет истину. Фактический: возвращает false. Возвраты отладочных отпечатков комментируются, поэтому их легко понять.

Содержимое утилит. Пакета:

package util;

public enum Package {
LUCK_1,LUCK_2,LUCK_3,LUCK_4,LUCK_5,SPEED_1,SPEED_2,SPEED_3,SPEED_4,SPEED_5,J
MSG_DEFAULT, JMSG_COMPUTERSPEAK, JMSG_RAINBOW, JMSG_ROYALTY, 
JMSG_FESTIVE,SHOVEL_STONE,SHOVEL_IRON,SHOVEL_GOLD,
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
263
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это отлично работает для меня:

public final class Foo {
    public static void main(String[] args) { //Just for testing
        final UUID uuid = UUID.randomUUID();
        newPlayer(uuid);

        addPackage(uuid, Package.LUCK_1);
        addPackage(uuid, Package.LUCK_2);

        System.out.println(hasPackage(uuid, Package.LUCK_1));
        System.out.println(hasPackage(uuid, Package.LUCK_2));
        System.out.println(hasPackage(uuid, Package.LUCK_3));

        System.out.println(PACKAGE_MAP.toString());
    }

    private static final Map<UUID, List<Package>> PACKAGE_MAP = new HashMap<>();

    public static void newPlayer(UUID uuid) {
        List<Package> n = new ArrayList<>();
        n.add(Package.JMSG_DEFAULT);
        PACKAGE_MAP.put(uuid, n);
    }

    public static boolean addPackage(UUID uuid, Package pack) {
        if (!PACKAGE_MAP.containsKey(uuid)) return false;

        if (!PACKAGE_MAP.get(uuid).contains(pack)) {
            List<Package> op = PACKAGE_MAP.get(uuid);
            op.add(pack);
            //removed `remove` and `put` here.
            return true;
        }
        return false;
    }

    public static boolean hasPackage(UUID uuid, Package pack) {
        if (!PACKAGE_MAP.containsKey(uuid)) return false;
        return PACKAGE_MAP.get(uuid).contains(pack);
    }
}

Класс пакета

public enum Package {
    LUCK_1,
    LUCK_2,
    LUCK_3,
    LUCK_4,
    LUCK_5,
    SPEED_1,
    SPEED_2,
    SPEED_3,
    SPEED_4,
    SPEED_5,
    JMSG_DEFAULT,
    JMSG_COMPUTERSPEAK,
    JMSG_RAINBOW,
    JMSG_ROYALTY,
    JMSG_FESTIVE,
    SHOVEL_STONE,
    SHOVEL_IRON,
    SHOVEL_GOLD
}

Вывод:

true

true

false

{55fc709a-7a25-45e6-9ff2-b48345747d39=[JMSG_DEFAULT, LUCK_1, LUCK_2]}

Некоторые примечания для этого: вам не нужно снимать и еще раз вставлять List в Map, если вы модифицируете List, когда он ссылается на List внутри Map.

Будет ли иметь значение тот факт, что я использую ArrayList вместо List (в вашем примере)? Это единственное различие, которое я вижу, так как я тоже пробовал изменить arrayylist внутри карты.

Tom G 25.12.2018 12:04

Обновлено: только что понял, что происходит. Оказывается, это не имеет ничего общего с методами здесь, вместо этого, как я дважды вызывал addPackage на основе результата hasPackage. Это была ошибка новичка.

Tom G 25.12.2018 12:36

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