Сохраните значения без перезаписи - PullRequest
0 голосов
/ 30 апреля 2018

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

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Если ваши значения уникальны, используйте их в качестве ключей. Вам не нужно создавать класс. Вы можете использовать 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
            }
        };
0 голосов
/ 30 апреля 2018

Карта по определению будет иметь разные ключи. Если вы добавите пару ключ-значение и ключ уже существует, новая пара ключ-значение перезапишет существующую пару ключ-значение.

Для вашего сценария, когда у вас есть несколько значений для одного ключа, вы можете изучить следующие параметры

Вариант 1. Поскольку ваши пары ключ-значение не уникальны, они могут быть сохранены в виде списка пар . Для каждой пары ключ-значение вы можете создать пару и вставить ее в список.

List<Pair<String, Integer>> data = new ArrayList();
Pair<String, Integer> item = new Pair("abc", 1);
data.add(item);

Эта опция не дает вам оптимизированных возможностей поиска, которые поставляются с картой.

Вариант 2. Создайте Map<String, List<Integer>>. Вы больше не сможете выполнять простые операции надписи на карте, но сможете хранить все элементы, соответствующие каждому ключу, без потери информации, а также быстрее их извлекать.

0 голосов
/ 30 апреля 2018

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

if (!map.containsKey("aaaa")) {
  map.put("aaaa", new ArrayList<Integer>());
}
List<Integer> aaaaValues = map.get("aaaa");
aaaaValues.add(1);
aaaaValues.add(4);
...
...