К вопросу о HashMap

72
0
Назрели некоторые вопросы о HashMap.
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));
По правилам в первом случае должно быть 2, во втором 1. Но мы изменили ключ когда делали .put второй раз, а так делать не надо (ключ должен быть не изменяем).

Конечно, можно сделать так:
Код:
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:

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);
Первый случай должен вернуть истину (сравнение по содержимому), а второй - ложь (сравнение ссылок). Но нет гарантии такого поведения (да, оно будет работать, но мне неуютно от того, что оно может не сработать). Логично сравнивать отдельно вещь, отдельно размер и отдельно метадату, но велосипед спотыкается о NBT таги

Поэтому два вопроса:
1. как организовать безопасный Map для ItemStack (хранить предмет, мету и количество - не выход, есть ещё nbt)
2. как правильно сравнить ItemStack

И ещё вопрос по Map:
3. Нужна Мар с двумя ключами и одним значением из коробки (мультикей мап отдельно видел), а то велосипед сейчас такой - итерация по двум спискам с возвратом индекса одновременного вхождения в оба списка и получение объекта из третьего списка по этому индексу.

P.S.: Я понимаю, тема бред. Но не с банальными же вопросами лезть:)
P.P.S.: тут напомнили про .areItemStackEqual(). Хм... похоже вопрос о конгруэнтности стаков снят.
 
Удивительно. Эти ссылки я уже читал. С этих двух и статьи о двух одинаковых ключах в HashMap и возник вопрос.

Мне нужна структура для хранения инъективного соотношения ItemStack -> ItemStack (или Объект)
Нужно для хранения рецептов. В рецепт печки не посылайте, там сделано перебором всех ключей и сравнением через .areItemStackEqual().
А в целом мне это надо для хранения однозначного соотношения много -> много. Т.е. ключом является несколько объектов и значением тоже несколько объектов. Если второе - это простой список или массив, то с ключом трудности. Использовать список или массив в качестве ключа - это нелепо.

Хотя это вполне реализуется опять же через те же итераторы и полный просмотр списка ключей. Но хочется как-то более коробочно и менее велосипедно.
 
Не похоже. Верстак делается полным просмотром, делать запрос из Мар там нелогично. Хотя в копилке лишнем не будет.
Нет, скорей для два входа печка, когда из двух получаешь один. В ТЕ смотрел, там интересно сделано, но там переписывали ХешМап под себя и ключём был лист.
 
Назад
Сверху