【问题标题】:Returning entryset in map using key value使用键值返回映射中的条目集
【发布时间】:2018-11-06 21:10:29
【问题描述】:

我有两个字符串值 IDValue 来自我的代码,我需要将其存储在地图中而不迭代地图,而是通过键值检查如果它存在于地图中。 ID 可以多次出现不同的值,在这种情况下,我将其添加到 ID 的现有条目中,并将值与现有值一起添加

我用字符串和列表创建了一个地图来添加值,但我遇到了困难,

Map> accessMap = new HashMap>();

如果键不存在,添加一个带有 ID 和值的新条目(作为列表)。

如果 ID 已经存在于地图中,如何在地图中找到键并获取 entrySet 而无需遍历地图并单独添加值。

例子,

while(accessList.hasNext()){


....


....

String id = accessEntry.get(ID);

String value = accessEntry.get(Value);


/*Add the id and value to the map if not present, if ID is present add the    *value alone to the entrySet.Value (which is a list)
*/

}

必须将 ID 和值添加到地图中,检查 ID 是否已存在于地图中,如果没有则创建新条目。

accessList 可能有许多具有不同值的 ID 引用,在这种情况下,应将值添加到已存在条目的 entrySet 中,该值将是具有单值或多值的列表。

【问题讨论】:

    标签: java


    【解决方案1】:
    public static void add(Map<String, Set<String>> map, String key, String value) {
        map.compute(key, (id, values) -> {
            (values = Optional.ofNullable(values).orElseGet(LinkedHashSet::new)).add(value);
            return values;
        });
    }
    

    对于值,最好使用Set 排除重复项。

    【讨论】:

    • 是否可以通过检查重复在 List 中检索,因为 List 必须再次设置为另一个仅接受 List 的变量
    • 您可以将Set 转换为Listnew ArrayList&lt;&gt;(set)
    • 谢谢,我可以创建列表了。
    • 这个线程安全还是我应该同步方法,请确认。
    • 如果我同步方法可以吗?
    【解决方案2】:

    使用computeIfAbsent()id 初始化一个List,如果尚不存在,则只需将value 添加到其中:

    entitlementMap.computeIfAbsent(id, s -> new ArrayList<>()).add(value);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-13
      • 2022-08-13
      • 2011-09-10
      • 2019-10-22
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      相关资源
      最近更新 更多