У меня есть хэш-карта типа 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,
}




Это отлично работает для меня:
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.
Обновлено: только что понял, что происходит. Оказывается, это не имеет ничего общего с методами здесь, вместо этого, как я дважды вызывал addPackage на основе результата hasPackage. Это была ошибка новичка.
Будет ли иметь значение тот факт, что я использую ArrayList вместо List (в вашем примере)? Это единственное различие, которое я вижу, так как я тоже пробовал изменить arrayylist внутри карты.