【问题标题】:How to change the value associated with a key in a list of HashMaps that have same Keys?如何更改与具有相同键的 HashMap 列表中的键关联的值?
【发布时间】:2018-12-22 23:00:24
【问题描述】:

我的输入中有一个总共 13 个 HashMap 的列表。每个 HashMap 只有 2 个 Keys“fieldName”和“accessibilityType”以及对应的值:

"fieldAccessibility": [
    {
        "fieldName": "firstName",
        "accessibilityType": "EDITABLE"
    },
    {
        "fieldName": "lastName",
        "accessibilityType": "EDITABLE"
    },
    {
        "fieldName": "avatarUrl",
        "accessibilityType": "EDITABLE"
    },
    {
        "fieldName": "username",
        "accessibilityType": "EDITABLE"
    },
    {
        "fieldName": "birthDate",
        "accessibilityType": "EDITABLE"
    },
    {
        "fieldName": "phoneNumbers",
        "accessibilityType": "EDITABLE"
    },
    {
        "fieldName": "email",
        "accessibilityType": "EDITABLE"
    },
    {
        "fieldName": "language",
        "accessibilityType": "EDITABLE"
    },
    {
        "fieldName": "externalId",
        "accessibilityType": "EDITABLE"
    },
    {
        "fieldName": "externalCode",
        "accessibilityType": "EDITABLE"
    },
    {
        "fieldName": "punchBadgeId",
        "accessibilityType": "EDITABLE"
    },
    {
        "fieldName": "minor",
        "accessibilityType": "EDITABLE"
    },
    {
        "fieldName": "seniorityDate",
        "accessibilityType": "EDITABLE"
    }
]

我正在尝试遍历此并将“accessibilityType”的值更改为“READ”,其中“fieldName”为“birthDate”。有人可以说一下有效的方法吗?到目前为止,这是我尝试读取和打印每个键值对的尝试:

final List<HashMap<String, String>> list = some code to get the input;
    for (HashMap<String, String> m : list)
    {
        for (HashMap.Entry<String, String> e : m.entrySet())
        {
            String key = e.getKey();
            String value = e.getValue();

            System.out.println("SEE HERE TEST " + key + " = " + value);

        }}

【问题讨论】:

  • 为什么要使用 HashMap 列表而不是更简单的 POJO 列表?我想知道您的问题是否实际上是 XY Problem 问题,您的整个方法可能不正确。
  • POJO:普通的旧 Java 对象,创建一个具有两个字段的 FieldAccessibility 类,一个文件名字符串和一个可编辑的布尔值。使用 JSON 库来解析文件并帮助创建一个填充此类型对象的List&lt;FieldAccessibility&gt;
  • @feelingunwelcome 这怎么是上述的骗子?
  • @feelingunwelcome 在 cmets...,而不是在帖子本身。另外,这与“我试图遍历对象数组以返回匹配的索引”的副本有何不同?
  • 我不知道您为什么不只使用包含{{"firstName", "editable"}, ...} 的单个地图。额外的间接级别什么也没增加。

标签: java arrays list hashmap java-stream


【解决方案1】:

从 JDK-8 开始,使用 forEach 可以如下完成:

list.forEach(map -> {
      String fieldName = map.get("fieldName");
      if("birthDate".equals(fieldName)) map.put("accessibilityType", "READ");
});

【讨论】:

    【解决方案2】:

    你可以这样做,

    List<Map<String, String>> updatedMaps = list.stream()
            .map(m -> m.entrySet().stream().collect(Collectors.toMap(
            Map.Entry::getKey,
            e -> m.containsValue("birthDate") && e.getKey().equals("accessibilityType") ? "READ" : e.getValue())))
            .collect(Collectors.toList());
    

    遍历每张地图,同时将其映射到新地图。键保持不变,只有值可能会改变。如果您的映射包含键 birthDate 并且当前条目的键是 accessibilityType,则将 READ 合并为该映射条目的新值。否则保持现有值不变。最后将所有新地图收集到一个结果容器中。

    【讨论】:

    • 很抱歉有多余的评论,但您知道将 List> 转换为单个 JSONObject 的方法吗?
    猜你喜欢
    • 1970-01-01
    • 2012-09-11
    • 2013-10-16
    • 1970-01-01
    • 2021-05-16
    • 2017-06-13
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多