HashMap>, arraylist не будет хранить значения - PullRequest
0 голосов
/ 24 декабря 2018

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

util.Package - это тип enum с парой Enums внутри.

Я пробовал разные способы добавления (Straight thruкарта: 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);
}

Пакеты.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) вернет true.Фактически: возвращается false.Возвращение отладочных отпечатков комментируется, поэтому их легко понять.

Содержимое util.Package:

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,
}

1 Ответ

0 голосов
/ 24 декабря 2018

Это нормально для меня:

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.

...