-6
Map<String, String> map = new HashMap<String, String>();
map.put("1", "xyz");
map.put("1", "abc");
map.put("1", "cde");
map.put("2", "err");`

`

对于上面的地图,我想获取与键 1 关联的所有值。预期的输出。

Key:: 1 值是:: xyz, abc, cde

值的顺序并不重要。

4

11 回答 11

7

在 Map 中,键应始终为unique. 如果将新值关联到现有键,它将覆盖现有条目的值。

您可能需要检查Map#put(K, V)方法的接口。

如果映射先前包含键的映射,则旧值将替换为指定值。

因此,在您的情况下,您的地图将始终"cde"作为 key 的值"1"

于 2013-07-25T10:05:29.310 回答
6

使用多图

    MultiMap mapValue = new MultiValueMap();

    mapValue.put("1", "xyz");
    mapValue.put("1", "abc");
    mapValue.put("1", "cde");
    mapValue.put("2", "err");
    System.out.println("Map : " + mapValue);

输出: Map : {2=[err], 1=[xyz, abc, cde]}

于 2013-07-25T10:10:46.277 回答
4

地图不能有重复的键。

如果你想实现你所描述的问题。首先你需要使用多图

于 2013-07-25T10:08:02.543 回答
1

你在做什么是错误的。

地图不允许重复。

所以 一键----------->一个值

如果您看到 put() 的文档

将指定值与此映射中的指定键关联(可选操作)。如果映射先前包含键的映射,则旧值将替换为指定值。(当且仅当 m.containsKey(k) 返回 true 时,映射 m 被称为包含键 k 的映射。)

您可以打印每个keyvalue喜欢的值

Ex:

Map<String, String> map = new HashMap<String, String>();
for (Map.Entry<String, String> entry : map.entrySet()) {
    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
于 2013-07-25T10:08:25.197 回答
0

来自关于HashMap .put(K key, V value) 方法的java文档:

将指定的值与此映射中的指定键相关联。如果映射先前包含键的映射,则替换旧值。

所以你不能那样做。

于 2013-07-25T10:11:07.893 回答
0

这是不可能的,映射之所以称为映射,是因为它将一个键值映射到一个值。多个键可以映射到相同的值,但反之则不行。

您可能想要的是映射到 a 的地图List<String>

final Map<String, List<String>> map = new HashMap<>();

if (map.get("1") == null) {
  map.put("1", new ArrayList<String>());
}

map.get("1").add("xyz");

// ...

添加的辅助函数可能很方便

public static <K, V> void add(final K key, final V value, final Map<K, List<V>> map)
{
    if (map.get(key) == null) {
      map.put(key, new ArrayList<V>());
    }

    map.get(key).add(value);
}
于 2013-07-25T10:06:27.360 回答
0

Map 你不能有重复的键。所以在你的情况下,为键 1 放置的最终值。“cde”将保留在 Map

您可以执行以下操作来实现您的期望

  Map<String, List<String>> map = new HashMap<>();
    List<String> list=new ArrayList<>();
    List<String> list1=new ArrayList<>();
    list.add("xyz");
    list.add("abc");
    list.add("cde");
    list1.add("err");
    map.put("1", list);
    map.put("2",list1);
    System.out.println(map.get("1"));
于 2013-07-25T10:06:54.887 回答
0

你不能用这种类型的地图做到这一点。map 中的键必须是唯一的。

为此,您应该声明一个映射,其中键是字符串,但值是字符串的集合。

Map<String,Collection<String>> map = new HashMap<String,Collection<String>>();

要从中列出值,您可以这样做

for(String valueOfKey : map.get("key") {
   //print or something else 
}

请注意,要向其中添加一些值,您必须首先检查密钥是否已存储,如果没有,则首先声明一个集合。

if(map.contains("key") == false) {
  map.put(new ArrayList<String>());
}

map.get("key").add("value");

由于这是众所周知的设计,您可能对 guava 框架和Multimap感兴趣

这个类的好处是它已经实现了如何从中添加和检索值的逻辑。

于 2013-07-25T10:07:41.293 回答
0

HashMap::put 覆盖与键关联的旧值。您必须在每个地图条目中放置一个列表,并在适当的列表中插入新值。

于 2013-07-25T10:09:31.483 回答
0

您可以执行以下操作:

for (String k : map.keySet())
    System.out.println(k);

这将打印 中的键HashMap,但对订单没有任何保证。

于 2018-04-11T01:17:06.197 回答
-1

您不能有哈希映射的重复键,请参阅下面的 SO,了解 HashMap 中的重复键会发生什么

于 2013-07-25T10:07:43.673 回答