У меня есть Map<String, Integer>, например.
"aaa", 1"bbb", 2"ccc", 3"aaa", 4Проблема в том, что HashMap не хранит все ключи и значения, как я понял, когда я пытаюсь добавить последнюю пару ("aaa", 4), она не будет добавлена, вместо этого значение для "aaa" (я имею в виду 1) будет перезаписано на 4.
Я знаю, что мог бы создать класс, где я мог бы хранить эти пары, но мне нужно другое решение. (без создания нового класса)
РЕДАКТИРОВАТЬ ------------------------------------ На самом деле у меня гораздо больше пар, и у меня нет уникальных String или Integer, я имею в виду, что если даже у меня есть две похожие пары, они будут сохранены
Почему вы не используете Map <String, List <Integer>>? Или Apache Commons / Guava MultiMap?
Если Integer уникален, вы можете использовать <Integer, String>
Также можно выбрать List <Pair <String, Integer >>
Я желаю того дня, когда у нас будет мульти-карта в коллекции ядра Java.
На самом деле, этот список содержит гораздо больше элементов, где я хочу хранить каждую пару, даже если эта пара уже существует (я хочу иметь оба в списке, хэш-карту или где-то еще :) помимо класса




Создать список:
if (!map.containsKey("aaaa")) {
map.put("aaaa", new ArrayList<Integer>());
}
List<Integer> aaaaValues = map.get("aaaa");
aaaaValues.add(1);
aaaaValues.add(4);
...
Если ваши ценности уникальны, используйте их как ключи.
Вам не нужно создавать класс. Можно использовать List<org.apache.commons.lang3.tuple.Pair<String, Integer>>
Также в одном из способов переопределить equals и hashCode, где вы говорите, что объект уникален, только если параметр String и Integer уникален в паре
Map<String, Integer> map = new HashMap<String, Integer>(){
@Override
public boolean equals(Object o)
{
// your realization
}
@Override
public int hashCode()
{
// your realization
}
};
Карта по определению имеет разные ключи. Если вы добавляете пару "ключ-значение", а ключ уже существует, новая пара "ключ-значение" перезапишет существующую пару "ключ-значение".
Для вашего сценария, когда у вас есть несколько значений для одного ключа, вы можете изучить следующие варианты
Вариант 1. Поскольку ваши пары "ключ-значение" не уникальны, их можно сохранить как список пары. Для каждой пары "ключ-значение" вы можете создать пару и вставить ее в список.
List<Pair<String, Integer>> data = new ArrayList();
Pair<String, Integer> item = new Pair("abc", 1);
data.add(item);
Эта опция не дает вам оптимизированных возможностей поиска, которые поставляются с Map.
Вариант 2. Создать Map<String, List<Integer>>. Вы больше не сможете выполнять простые операции размещения на карте, но вы сможете сохранять все элементы, соответствующие каждому ключу, без потери информации, а также быстрее извлекать их.
Взгляните на MultiMap