Подтвердить что ты не робот

Как включить дубликаты ключей в HashMap?

Мне нужно связать и несколько ключей в наборе ключей. Я пробовал это:

LinkedHashMap<Integer, String> map = new LinkedHashMap< Integer,String>();

map.put( -1505711364,"4");
map.put(294357273, "15"); map.put(-1593134417, "28"); map.put(-1231165758, "45");
map.put(121046798, "58");
map.put(294357273, "71"); map.put(-1593134417, "82"); map.put(-1231165758, "95");
map.put(121046798, "108");

Мне нужны дубликаты ключей, порядок которых сохранен. Каков способ сделать это?

4b9b3361

Ответ 1

У вас не может быть дубликатов ключей в Map. Вы можете создать Map<Key, List<Value>> или, если можете, использовать Guava Multimap.

Multimap<Integer, String> multimap = ArrayListMultimap.create();
multimap.put(1, "rohit");
multimap.put(1, "jain");

System.out.println(multimap.get(1));  // Prints - [rohit, jain]

И затем вы можете получить java.util.Map с помощью метода Multimap#asMap().

Ответ 2

Используйте Map<Integer, List<String>>:

Map<Integer, List<String>> map = new LinkedHashMap< Integer, List<String>>();

map.put(-1505711364, new ArrayList<>(Arrays.asList("4")));
map.put(294357273, new ArrayList<>(Arrays.asList("15", "71")));
//...

Чтобы добавить новую пару ключ/значение на этой карте:

public void add(Integer key, String newValue) {
    List<String> currentValue = map.get(key);
    if (currentValue == null) {
        currentValue = new ArrayList<String>();
        map.put(key, currentValue);
    }
    currentValue.add(newValue);
}

Ответ 3

Map не поддерживает дубликаты ключей. вы можете использовать коллекцию как значение против того же ключа.

Связывает указанное значение с указанным ключом на этой карте (дополнительная операция). Если на карте ранее содержалось отображение для ключ, старое значение заменяется указанным значением.

Документация

вы можете использовать любую реализацию List или Set в соответствии с вашим требованием.

Если ваши значения могут быть также дублируемыми, вы можете пойти с ArrayList или LinkedList, в случае, если значения уникальны, вы можете использовать HashSet или TreeSet и т.д.


Также в сборнике google guava Multimap, это набор, который отображает ключи к значениям, аналогичные Map, но в которых каждый ключ может быть связан с несколькими значениями. Вы можете визуализировать содержимое мультимазки либо как карту от ключей к непустым наборам значений:

a → 1, 2
b → 3  

Пример -

ListMultimap<String, String> multimap = ArrayListMultimap.create();
multimap.put("a", "1");
multimap.put("a", "2");
multimap.put("c", "3");

Ответ 4

hashMaps не может быть дубликатов ключей. Тем не менее, вы можете создать карту со значениями списка:

Map<Integer, List<String>>

Однако использование этого подхода будет иметь последствия для производительности.