是否可以在HashMap中保留与键对应的多个值?如果是,怎么样?
答案 0 :(得分:10)
是的,这称为链接。您将希望尽可能避免链接,特别是如果链的大小开始增加。较长的链大小将抵消使用哈希结构的整个目的,因为目标是尽可能接近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);
答案 1 :(得分:9)
你可以试试Guava library(以前的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"));
答案 2 :(得分:1)
使用Map<String, List<String>>
。
答案 3 :(得分:0)
严格来说,没有。
但是!您可以使用某种Collection
作为您的值,并使用它来存储任意数量的值。
答案 4 :(得分:0)
是的,但前提是Map
中存储的值类型是数组或列表:
Map<String, List<String>> myMap
或
Map<String, String[]> myMap
但在通用数据结构中构建通用数据结构通常是不好的做法。
为什么不写一个包含HashMap
的特定于域的类,并且更容易检查是否存在值,每个键的项目数等等?
答案 5 :(得分:0)
不使用任何其他库 创建一个键为String且值为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]}