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