Java中HashMap中键的多个值

时间:2012-09-21 19:04:53

标签: java hashmap

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

6 个答案:

答案 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]}