是否可以保留与 HashMap 中的键对应的多个值?如果是,如何?
6 回答
是的,这称为链接。您将希望尽可能避免链接,尤其是当链的大小开始增加时。更长的链大小将违背使用散列结构的全部目的,因为目标是尽可能接近 O(1)。
Map<String, List<String>> hm = new HashMap<String, List<String>>();
List<String> values = new ArrayList<String>();
values.add("Value 1");
values.add("Value 2");
hm.put("Key1", values);
您可以在Guava 库(以前的 Google 收藏)中试一试。它具有 Multimaps 的实现,可以为单个键存储多个值。
例如ListMultimap实现允许以插入顺序保存的重复键/值对。
下面是你如何使用它:
ListMultimap<String, Integer> numberClasses = ArrayListMultimap.create();
numberClasses.put("odd", 1);
numberClasses.put("odd", 3);
numberClasses.put("odd", 5);
numberClasses.put("even", 2);
numberClasses.put("even", 4);
numberClasses.put("even", 6);
assertEquals(Arrays.asList(1,3,5), numberClasses.get("odd"));
assertEquals(Arrays.asList(2,4,6), numberClasses.get("even"));
另一个很酷的例子是SetMultimap,它与 ListMultimap 非常相似,只是键的值保存在一个集合中。(从用户的角度来看,我不知道它是如何实现的。)
SetMultimap<String, Integer> setMultimap= HashMultimap.create();
setMultimap.put("key1", 1);
setMultimap.put("key1", 1);
setMultimap.put("key1", 1);
setMultimap.put("key1", 2);
setMultimap.put("key2", 1);
setMultimap.put("key2", 3);
assertEquals(ImmutableSet.of(1,2), setMultimap.get("key1"));
assertEquals(ImmutableSet.of(1,3), setMultimap.get("key2"));
使用Map<String, List<String>>
.
严格来说,没有。
但!您可以将某种值作为您的值,Collection
并使用它来存储任意数量的值。
是的,但前提是存储在您的值类型Map
是数组或列表:
Map<String, List<String>> myMap
或者
Map<String, String[]> myMap
但是在通用数据结构中构建通用数据结构通常是不好的做法。
为什么不编写一个特定于域的类来包装HashMap
,并使您更容易检查值的存在、每个键的项目数等?
在不使用任何其他库的情况下,以 Key 作为 String 和 value 作为 HashSet 的值创建一个映射,将不会重复字符串。
multivaleMap.computeIfAbsent("key", k -> new HashSet<String>()).add("value1");
multivaleMap.computeIfAbsent("key", k -> new HashSet<String>()).add("value2");
System.out.println(multivaleMap);``` will print {key=[value2, value1]}