Java 如何在映射中查找键的重复值

Java 如何在映射中查找键的重复值,java,Java,我有一个场景,我需要读取一个JSON文件并检查一个键的重复条目(MEMBER\u ID),如果存在重复条目,那么我需要获取最后一个条目(成员的最后更新细节)并添加到最终列表中。e、 g在下面的json中,对于MEMBER_ID=123有两个条目,一个带有LASTNAME作为VSDWRVFFZA的条目应添加到最终列表中。我尝试了几种过滤方法,但没能找到最终的解决方案。有人能建议我如何处理这件事吗 我把逻辑写成: List<Map<String, Object>> final

我有一个场景,我需要读取一个JSON文件并检查一个键的重复条目(
MEMBER\u ID
),如果存在重复条目,那么我需要获取最后一个条目(成员的最后更新细节)并添加到最终列表中。e、 g在下面的json中,对于
MEMBER_ID=123
有两个条目,一个带有
LASTNAME
作为
VSDWRVFFZA
的条目应添加到最终列表中。我尝试了几种过滤方法,但没能找到最终的解决方案。有人能建议我如何处理这件事吗

我把逻辑写成:

List<Map<String, Object>> finalList = new ArrayList<>();
...
...

`if (file.exists() && file.length() != 0) {
            jsonValue = objectMapper.readValue(file, List.class);
            jsonValue.forEach(value -> {
                try {
                    populateAndMapJSON(value);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });`...
...


        private void populateAndMapJSON(Map<String, Object> value) throws IOException {

        if ((value.containsKey(FIRST_NAME) || value.containsKey(LAST_NAME)) {

// NOT SURE HOW TO PUT FILTER HERE FOR GIVEN SCENARIO

            finalList.add(value);
...
..

使用流API,您可以

  • 按成员ID分组(生成按ID匹配的列表),然后
  • 使用最后一个减少多个匹配
代码:

Set uniqueByLast=finalList.stream()
.collect(Collectors.groupingBy(m->m.get(“MEMBER_ID”))//按ID分组
.entrySet().stream()
.map(e->e.getValue().stream())
.reduce((first,second)->second))//如果有多个条目,则查找最后一个
.map(可选::get)
.collect(收集器.toSet());

因此,您将获得一组所有唯一的对象映射。

如何知道“成员上次更新的详细信息”?您可以选择返回以前的值(如果有)。有了这两个,您应该能够根据您的需求插入值(我不完全理解,所以我让您这样做)。或者,如果您想为同一个键设置多个值,请检查这里是否有JSON数组。您是如何在地图上找到重复键的?也许你应该考虑使用另一种结构?你能解释一下吗?1.您正在处理JSON数组吗?2.您要检查哪个密钥的唯一性?是。它的Json数组,我使用objectMapper.readValue(文件,List.class)来获取类型为List的jsonValue。
{
    "MEMBER_ID": "123",
    "LASTNAME": " fgjksnc",
    "BIRTH_DATE": "1905-12-29",
    "FIRSTNAME": "abcdf",
}, {
    "MEMBER_ID": "09876",
    "M": "abc",
    "N": "def"
}, {
    "MEMBER_ID": "123",
    "LASTNAME": "VSDWRVFFZA",
    "BIRTH_DATE": "1905-12-20",
    "FIRSTNAME": "UFZCY LGNF",
}
Set<Map<String, Object>> uniqueByLast = finalList.stream()
        .collect(Collectors.groupingBy(m -> m.get("MEMBER_ID"))) // group by id
        .entrySet().stream()
        .map(e -> e.getValue().stream()
                .reduce((first, second) -> second)) // find last, if multiple entries
        .map(Optional::get)
        .collect(Collectors.toSet());