亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

比較兩個 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 關注
  • 109 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號