Java中HashMap中键的多个值

是否可以在HashMap中保留与键对应的多个值? 如果有,怎么样?

是的,这叫做链接。 您将希望尽可能避免链接,特别是如果链的大小开始增加。 较长的链大小将抵消使用散列结构的整个目的,因为目标是尽可能接近O(1)。

 Map> hm = new HashMap>(); List values = new ArrayList(); values.add("Value 1"); values.add("Value 2"); hm.put("Key1", values); 

你可以试试Guava图书馆 (以前的谷歌collections)。 它具有Multimaps的实现,可以为单个密钥存储多个值。

例如, ListMultimap实现允许以插入顺序保存的重复键/值对。

这是你如何使用它:

 ListMultimap 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 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>

严格来说,没有。

但! 您可以使用某种Collection作为您的值,并使用它来存储任意数量的值。

是的,但仅当存储在Map的值类型是数组或List时:

Map> myMap

要么

Map myMap

但是在通用数据结构中构建通用数据结构通常是不好的做法。

为什么不编写一个包含HashMap的特定于域的类,并使您更容易检查是否存在值,每个键的项数等等?