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);
}