Java - 将另一个String值添加到现有HashMap Key而不覆盖?

时间:2015-04-18 12:17:25

标签: java hashmap

我想知道是否有人可以帮助将另一个String值添加到Java中HashMap内的现有密钥中?

我了解您可以使用this.put("String", "String")方法添加键值对。但是,它会覆盖现有值,而我希望使用相同的密钥存储和配对多个值?

感谢您的帮助。

9 个答案:

答案 0 :(得分:15)

你希望在这里取得什么成果?

您的案例中的MapHashMap)是从一个“密钥”到另一个值的直接“映射”。

E.g。

"foo" -> 123
"bar" -> 321
"far" -> 12345
"boo" -> 54321

这意味着如果您尝试:

myHashMap.get("foo");

它将返回值123(当然,您返回的值的类型可以是您想要的任何内容)。

当然,这也意味着您对键的值所做的任何更改,它会覆盖您为其指定的原始值,就像更改变量的值将覆盖原始值一样。

说:

myHashMap.put("foo", 42);

地图中"foo"的旧值将替换为42。所以它会变成:

"foo" -> 42
"bar" -> 321
"far" -> 12345
"boo" -> 54321

但是,如果您需要从单个键映射的多个String个对象,则可以使用另一个可以存储多个对象的对象,例如Array或List(甚至是另一个{{1}如果你想要的话。

例如,如果您要使用HashMap,那么当您为ArrayLists分配值时(比如称为HashMap),您首先要检查是否之前已使用过密钥,如果没有,则使用要添加的值创建新的myHashMap,如果有,则只需将该值添加到列表中。

(假设ArrayListkey具有您想要的值)

value

答案 1 :(得分:2)

正如其他人指出的那样,Map按规范只能为给定的密钥设置一个值。你有两个解决方案:

  • 使用HashMap<String, List<String>>存储数据
  • 使用第三方Google Collections lib
  • 提供的Multimap

答案 2 :(得分:2)

您可以这样做!

Map<String,List<String>> map = new HashMap<>();
.
.
if(map.containsKey(key)){
    map.get(key).add(value);
} else {
   List<String> list = new ArrayList<>();
   list.add(value);
   map.put(key, list);
}

或者,您可以用Java 8样式的一行代码来做同样的事情。

map.computeIfAbsent(key, k ->new ArrayList<>()).add(value);

答案 3 :(得分:1)

你想要两个字符串的串联吗?

map.put(key, val);
if (map.containsKey(key)) {
    map.put(key, map.get(key) + newVal);
}

或者您想要该键的所有值的列表?

HashMap<String,List<String>> map = new HashMap<String,List<String>>();
String key = "key";
String val = "val";
String newVal = "newVal";
List<String> list = new ArrayList<String>();
list.add(val);
map.put(key, list);
if (map.containsKey(key)) {
    map.get(key).add(newVal);
}

答案 4 :(得分:0)

将值存储为map下的列表因此,如果key是test并且有两个值,例如val1和val2,那么key将是test,value将是包含val1和val2的列表

但是如果你的意图是为同一个键设置两个单独的条目,那么这不是Map的设计目的。想想你是否做map.get(“key”),你想要的值

答案 5 :(得分:0)

Map interface documentation中所述,Map包含一组键,因此它不能包含多个非唯一键。

我建议您使用列表作为此地图的值。

答案 6 :(得分:0)

您可以使用Map<String, Collection<String>>但添加和删除值会很麻烦。更好的方法是使用guava Multimap - 一个容器,允许为每个键存储多个值。

答案 7 :(得分:0)

您不能在单个键下直接存储多个值,但与键关联的值可以是任何类型的对象,例如ArrayList,它将包含多个值。例如:

import java.util.ArrayList;
import java.util.HashMap;

public class HashMapList {
    HashMap<String, ArrayList<String>> strings = new HashMap<String, ArrayList<String>>();

    public void add(String key, String value) {
        ArrayList<String> values = strings.get(key);
        if (values == null) {
            values = new ArrayList<String>();
            strings.put(key, values);
        }

        values.add(value);
    }

    public ArrayList<String> get(String key) {
        return strings.get(key);
    }

    public static void main(String[] argv) {
        HashMapList mymap = new HashMapList();

        mymap.add("key", "value1");
        mymap.add("key", "value2");

        ArrayList<String> values = mymap.get("key");
        for (String value : values) {
            System.out.println(value);
        }
    }
}

答案 8 :(得分:-1)

这是不可能的,因为如果你使用String作为map的键,String是不可变的,那么同一个键的值具有相同的hashcode值。