【问题标题】:Add element to Set when Set is the value of a Hashmap当 Set 是 Hashmap 的值时,将元素添加到 Set
【发布时间】:2018-03-10 07:24:08
【问题描述】:

这是我的地图

HashMap<String, Set<String>> hmap = new HashMap<>();

我想从我的Map 中检索一个Set 并向其中添加一个元素。

Set<String> val = hmap.get(key);
val.add(newElement);    //NPE
hmap.put(key, val);

但我在val.add 行得到NullPointerException

这可能是微不足道的,但我没有看到它..

我错过了什么?

【问题讨论】:

  • 这意味着hmap.get(key) 返回null ==> 这个键在你的地图中没有值
  • 所以我需要用新的Set来初始化key?
  • 如果密钥还没有设置,是的,您需要创建一个。这也是您需要执行hmap.put 的唯一情况。如果已经有一个集合,则不需要放回相同的集合。
  • 是的,您需要有一个从 key 到它的值的映射,这在您的情况下是一个集合。
  • @NickGinanto 我认为您是 Java 新手。因为HashMapget 方法将返回null,如果你没有设置任何想法。所以首先你需要用new关键字初始化。

标签: java hashmap set


【解决方案1】:

尝试以下选项:

HashMap<String, Set<String>> hmap = new HashMap<>();
Set<String> val = hmap.get(key);
if (val == null) {
    val = new HashSet<>();
    val.add(newElement);
    hmap.put(key, val);
}
else {
    val.add(newElement);
}

【讨论】:

    【解决方案2】:

    如果您正在编写修改给定键的映射条目的代码,最好先检查该特定键是否存在值。

    例子:

    if (hmap.contains(key) == false) 
    {
        // This will prevent the null reference issue
        hmap.put(key, new HashSet<String>());
    }
    Set<String> val = hmap.get(key);
    val.add(newElement);
    

    另外,作为旁注:

    hmap.put(key, val);
    

    不需要该行。 “val”是对地图中现有集合的引用。修改它会修改映射到key的值,所以你不需要调用put。它已经存在并已更新。

    【讨论】:

    • 这不是最有效的方法,因为您将查找相同的键两次。最好执行get 并检查null 结果。
    【解决方案3】:

    您可以使用Map.computeIfAbsent(),如果地图中不存在该键,则添加该值。

    请注意,该方法返回与指定键关联的当前(现有或计算)值。所以你可以使用返回的对象在 Set 对象中添加 String 对象:

    String key = "a key";
    Set<String> val = hmap.computeIfAbsent(key, k-> new HashSet<>()); // create the hashset and associate it to the key if key not present
    val.add("a value");
    

    【讨论】:

      【解决方案4】:

      为了简短起见,您也可以这样做:

      HashMap<String, Set<String>> hmap = new HashMap<>();
      String key = "key";
      String newElement = "ele";
      
      if (!hmap.containsKey(key)) {
          hmap.put(key, new HashSet<>());
      }
      hmap.get(key).add(newElement);
      

      【讨论】:

        【解决方案5】:

        这就是实际发生的事情

        Map<String, Set<String>> map = new HashMap<String, Set<String>>();
        map.put("1_a", new HashSet<String>());
        
        Set<String> set1 = map.get("1_a");
        set1.add("a");
        
        System.out.println(set1);
        
        Set<String> set2 = map.get("1_b");  // Not present
        set2.add("a");   // NPE - set2 will be null.
        

        您可以添加@Stephano 提到的支票,它总是很方便。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-05
          • 2014-05-01
          相关资源
          最近更新 更多