有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java在不覆盖的情况下向现有HashMap键添加另一个字符串值?

我想知道是否有人能够帮助在Java中的HashMap中向现有键添加另一个String

我知道您可以使用this.put("String", "String")方法添加键值对。但是,它会覆盖现有值,而我希望使用同一个键存储并配对多个值

谢谢你的帮助


共 (6) 个答案

  1. # 1 楼答案

    将值存储为映射下的列表,所以如果键是test,并且有两个值,比如val1和val2,那么键将是test,值将是包含val1和val2的列表

    但是,如果您的目的是为同一个键创建两个单独的条目,那么这并不是为地图设计的。想一想,如果你做地图。获取(“key”),您期望的值是多少

  2. # 2 楼答案

    你希望在这里取得什么成就

    在您的例子中Map(the HashMap)是从一个“键”到另一个值的直接“映射”

    例如

    "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对象,可以使用可以存储多个对象的不同对象,例如数组或列表(如果需要,甚至可以使用另一个HashMap

    例如,如果要使用ArrayLists,当您为HashMap赋值时(假设它被称为myHashMap),您将首先检查该键以前是否使用过,如果没有,则使用要添加的值创建一个新的ArrayList,如果有,则将该值添加到列表中

    (假设keyvalue具有所需的值)

    ArrayList<String> list;
    if(myHashMap.containsKey(key)){
        // if the key has already been used,
        // we'll just grab the array list and add the value to it
        list = myHashMap.get(key);
        list.add(value);
    } else {
        // if the key hasn't been used yet,
        // we'll create a new ArrayList<String> object, add the value
        // and put it in the array list with the new key
        list = new ArrayList<String>();
        list.add(value);
        myHashMap.put(key, list);
    }
    
  3. # 3 楼答案

    正如其他人指出的那样,Mapby规范对于给定的键只能有一个值。您有两种解决方案:

    • 使用HashMap<String, List<String>>存储数据
    • 使用第三方Google Collections库提供的Multimap
  4. # 4 楼答案

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

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

  5. # 5 楼答案

    你可以这样做

    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);
    
  6. # 6 楼答案

    您想要两个字符串的串联吗

    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);
    }