- 72
- 0
Назрели некоторые вопросы о HashMap.
1. Изменяемость ключа, как с этим бороться?
Что я имею ввиду: изменение ключа со временем. Т.е.
И вот тут я зашёл в тупик... что должно вернуть и что вернёт
По правилам в первом случае должно быть 2, во втором 1. Но мы изменили ключ когда делали .put второй раз, а так делать не надо (ключ должен быть не изменяем).
Конечно, можно сделать так:
В качестве ключа не сам объект, а его копия. Но тут возникает вопрос 2:
2. Эквиваленция, равенство и прочая конгруэнция
Первый случай должен вернуть истину (сравнение по содержимому), а второй - ложь (сравнение ссылок). Но нет гарантии такого поведения (да, оно будет работать, но мне неуютно от того, что оно может не сработать). Логично сравнивать отдельно вещь, отдельно размер и отдельно метадату, но велосипед спотыкается о NBT таги
Поэтому два вопроса:
1. как организовать безопасный Map для ItemStack (хранить предмет, мету и количество - не выход, есть ещё nbt)
2. как правильно сравнить ItemStack
И ещё вопрос по Map:
3. Нужна Мар с двумя ключами и одним значением из коробки (мультикей мап отдельно видел), а то велосипед сейчас такой - итерация по двум спискам с возвратом индекса одновременного вхождения в оба списка и получение объекта из третьего списка по этому индексу.
P.S.: Я понимаю, тема бред. Но не с банальными же вопросами лезть
P.P.S.: тут напомнили про .areItemStackEqual(). Хм... похоже вопрос о конгруэнтности стаков снят.
1. Изменяемость ключа, как с этим бороться?
Что я имею ввиду: изменение ключа со временем. Т.е.
Код:
Map<ItemStack, ?> map = new HashMap();
ItemStack item = new ItemStack(Items.bread,1,0);
map.put(item,1);
item.setDamage(2);
map.put(item,2)
Код:
sysout.print(map.get(item));
ItemStack item2 = new ItemStack(Items.bread,1,0);
sysout.print(map.get(item2));
Конечно, можно сделать так:
Код:
Map<ItemStack, ?> map = new HashMap();
ItemStack item = new ItemStack(Items.bread,1,0);
map.put(item.copy,1);
item.setDamage(2);
map.put(item.copy,2)
2. Эквиваленция, равенство и прочая конгруэнция
Код:
ItemStack item = new ItemStack(Items.bread,1,2);
ItemStack item2 = new ItemStack(Items.bread,1,0);
item2.setDamage(2);
sysout.print(item.equal(item2));
sysout.print(item==item2);
Поэтому два вопроса:
1. как организовать безопасный Map для ItemStack (хранить предмет, мету и количество - не выход, есть ещё nbt)
2. как правильно сравнить ItemStack
И ещё вопрос по Map:
3. Нужна Мар с двумя ключами и одним значением из коробки (мультикей мап отдельно видел), а то велосипед сейчас такой - итерация по двум спискам с возвратом индекса одновременного вхождения в оба списка и получение объекта из третьего списка по этому индексу.
P.S.: Я понимаю, тема бред. Но не с банальными же вопросами лезть
P.P.S.: тут напомнили про .areItemStackEqual(). Хм... похоже вопрос о конгруэнтности стаков снят.