Дубликаты элементов Java HashMap - PullRequest
9 голосов
/ 29 января 2011

Я хочу добавить дубликаты элементов в hashmap

так:

put("name1", 1);
put("name1", 3);
put("name1", 3);
put("name2", 1);
put("name2", 3);

как я могу это сделать?

Ответы [ 6 ]

13 голосов
/ 29 января 2011

Интерфейс ListMultimap из Guava может удовлетворить ваши требования. Это позволяет дублировать ключи и дублировать пары ключ / значение.

ListMultimap<String, Integer> m =
    ArrayListMultimap.create();
m.put("name1", 1);
m.put("name1", 3);
m.put("name1", 3);
m.put("name2", 1);
m.put("name2", 3);
System.out.println(m.get("name1")); // => [1, 3, 3]
System.out.println(m.get("name2")); // => [1, 3]

Кроме того, вам действительно нужно сохранить дублирующиеся пары ключ / значение? Если нет, то <a href="http://guava-libraries.googlecode.com/svn/tags/release08/javadoc/com/google/common/collect/HashMultimap.html" rel="nofollow noreferrer">HashMultimap</a> может быть достаточным (и более эффективным). Если вы вставите те же записи в HashMultimap, вы получите:

System.out.println(m.get("name1")); // => [1, 3]
System.out.println(m.get("name2")); // => [1, 3]
13 голосов
/ 29 января 2011

Используйте Map<String, List<Integer>>, т.е. вы отображаете строку в список целых чисел.

Итак, в этом случае name1 будет отображаться в списке [1,3,3].

Очевидно, вам придется написать собственный метод put, в котором вы добавите int в список. Пример:

put(String s, int i){
    List<Integer> list = map.get(s);
    if(list == null){
        list = new ArrayList<Integer>();
        map.put(s, list);
    }
    list.add(i);
}
5 голосов
/ 29 января 2011

Ваша идея нарушает договор интерфейса Карта :

An object that maps keys to values. A map cannot contain duplicate keys; each key can map to at most one value.

Понятно, что это будет путать с картой, когда вы спросите:

map.get("name1")

Он не знает, какое значение получить.

Я бы использовал решение dogbane для отображения каждого ключа в список целых чисел. В вашем примере у вас есть возможные дубликаты значений. Если вам не нужны повторяющиеся значения (т. Е. Для «name1» в результирующем списке будет только одна цифра 3), вместо этого вы можете сделать из него Map of Strings равным Задает целых чисел.

3 голосов
/ 29 января 2011

Вы должны использовать структуру данных Multimap Google Collection.

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

Это именно то, чего вы пытаетесь достичь.На мой взгляд, нет необходимости заново изобретать колесо, написав свои собственные операции с картой.Также вы можете найти этот учебник в MultiMap полезным.

0 голосов
/ 11 сентября 2017

org.apache.commons.collections.map.MultiValueMap - более подходящий выбор. Он может содержать один ключ для нескольких значений.

public Object put(Object key, Object value) {
    boolean result = false;
    Collection coll = getCollection(key);
    if (coll == null) {
        coll = createCollection(1);
        result = coll.add(value);
        if (coll.size() > 0) {
            // only add if non-zero size to maintain class state
            getMap().put(key, coll);
            result = false;
        }
    } else {
        result = coll.add(value);
    }
    return (result ? value : null);
}
0 голосов
/ 29 января 2011

Вы не можете, однако вы можете создать свою собственную реализацию карты, которая позволяет дублировать внутри.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...