为了账号安全,请及时绑定邮箱和手机立即绑定

比较两个 java 列表并将元素添加到最终列表?

比较两个 java 列表并将元素添加到最终列表?

慕仙森 2023-04-13 14:31:50
我现在有两个具有相同类型对象的列表,我正在尝试比较这两个列表并创建具有这些限制的最终列表dbRecord列表的所有记录应该在最终列表中可用如果两个列表的对象labelName相同,则从列表dbrecord中更新列表的对象userRecord。如果在列表中发现任何额外记录(与的列表对象userRecord比较),则应将其添加到最终列表中。labelNamedbRecord我尝试使用此代码,但问题是它没有将userRecord列表中找到的任何额外对象添加到最终列表List<Labels> dbRecord = roleRecord.getLabels();List<Labels> userRecord = role.getLabels();List<Labels> updatedLables = new ArrayList<>();boolean recordFound = false;            for (Labels labels : dbRecord) {                innerloop: for (Labels innerLabels : userRecord) {                    if (StringUtils.compare(labels.getLabelName().replaceAll("\\s+", "").toLowerCase(),                            innerLabels.getLabelName().replaceAll("\\s+", "").toLowerCase()) == 0) {                        recordFound = true;                        labels.setAccess(innerLabels.getAccess());                        labels.setMatch(innerLabels.getMatch());                        updatedLables.add(labels);                    }                    if (recordFound) {                        break innerloop;                    }                }                if (!recordFound) {                    updatedLables.add(labels);                }                recordFound = false;            }我在这段代码中缺少什么逻辑?
查看完整描述

1 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

这样的事情适合您的需要吗?


List<Labels> dbRecord = roleRecord.getLabels();

        List<Labels> userRecord = role.getLabels();


        Map<String, Labels> labelsByName = dbRecord.stream()

            .collect(Collectors.toMap(this::getCorrectedLabelName, i -> i));


        userRecord.stream()

            .filter(label -> labelsByName.containsKey(getCorrectedLabelName(label)))

            .forEach(label -> labelsByName.put(getCorrectedLabelName(label), label));


        Collection<Labels> updatedLabels = labelsByName.values();


private String getCorrectedLabelName(Labels label) {

        return label.getLabelName().replaceAll("\\s+", "").toLowerCase();

    }

首先,您使用列表按名称创建标签映射dbRecord。userRecord然后您可以轻松地从中找到与名称匹配的那些,并为它们中的每一个替换地图中的标签。


最后你收集地图值!


PS:这都是假设Labels没有重名!


希望这可以帮助


- - 编辑


 List<Labels> dbRecord = roleRecord.getLabels();

        List<Labels> userRecord = role.getLabels();


        // create Map from dbRecord

        Map<String, Labels> labelsByName = dbRecord.stream()

            .collect(Collectors.toMap(this::getCorrectedLabelName, i -> i));


        userRecord

            // for each of userRecord

            .forEach(userRecordLabel -> {

                // if in dbRecord, update dbRecord labels

                if(labelsByName.containsKey(getCorrectedLabelName(userRecordLabel))){

                    Labels dbRecordLabel = labelsByName.get(getCorrectedLabelName(userRecordLabel));

                    dbRecordLabel.setAccess(userRecordLabel.getAccess());

                    dbRecordLabel.setMatch(userRecordLabel.getMatch());


                    labelsByName.put(getCorrectedLabelName(userRecordLabel), dbRecordLabel);


                }else{// if not then add to map

                    labelsByName.put(getCorrectedLabelName(userRecordLabel), userRecordLabel);

                }

            });


        // final complete list

        Collection<Labels> updatedLabels = labelsByName.values();

这是应该工作或你的完整更正代码!


查看完整回答
反对 回复 2023-04-13
  • 1 回答
  • 0 关注
  • 83 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信