Java, в частности, повторяющиеся элементы

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

так:

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

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

6 ответов


использовать 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);
}

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

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]

Также вам действительно нужно сохранить дубликаты пар ключ / значение? Если нет, то HashMultimap может быть достаточно (и более эффективно.) Если вы вставляете те же записи в HashMultimap вы получаете:

System.out.println(m.get("name1")); // => [1, 3]
System.out.println(m.get("name2")); // => [1, 3]

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

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 list), вы могли бы вместо этого сделать его картой строк в наборы целых чисел.


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

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

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


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


org.апаш.палата общин.коллекции.карта.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);
}