Сохраняйте значения без перезаписи

У меня есть Map<String, Integer>, например.

  1. "aaa", 1
  2. "bbb", 2
  3. "ccc", 3
  4. "aaa", 4

Проблема в том, что HashMap не хранит все ключи и значения, как я понял, когда я пытаюсь добавить последнюю пару ("aaa", 4), она не будет добавлена, вместо этого значение для "aaa" (я имею в виду 1) будет перезаписано на 4.

Я знаю, что мог бы создать класс, где я мог бы хранить эти пары, но мне нужно другое решение. (без создания нового класса)

РЕДАКТИРОВАТЬ ------------------------------------ На самом деле у меня гораздо больше пар, и у меня нет уникальных String или Integer, я имею в виду, что если даже у меня есть две похожие пары, они будут сохранены

Взгляните на MultiMap

user7 30.04.2018 13:56

Почему вы не используете Map <String, List <Integer>>? Или Apache Commons / Guava MultiMap?

Valentin Michalak 30.04.2018 13:57

Если Integer уникален, вы можете использовать <Integer, String>

Harshit 30.04.2018 13:58

Также можно выбрать List <Pair <String, Integer >>

RobCo 30.04.2018 13:58

Я желаю того дня, когда у нас будет мульти-карта в коллекции ядра Java.

Shanu Gupta 30.04.2018 14:00

На самом деле, этот список содержит гораздо больше элементов, где я хочу хранить каждую пару, даже если эта пара уже существует (я хочу иметь оба в списке, хэш-карту или где-то еще :) помимо класса

Igor K 30.04.2018 14:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
878
3

Ответы 3

Создать список:

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>>. Вы больше не сможете выполнять простые операции размещения на карте, но вы сможете сохранять все элементы, соответствующие каждому ключу, без потери информации, а также быстрее извлекать их.

Другие вопросы по теме