JAVA中LIST实现关联和左关联ListStringUtil

本文介绍了一种在Java中实现的数据合并方法,包括强关联合并和左关联合并两种方式,能够有效地将字典表中的信息合并到主业务数据中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class ListStringUtil {

    /**@
     *  将相关字典表查询list信息合并到主业务查询数据List中(list数据强关联,mainList中存在匹配到dictList的数据才会返回)
     * @param mainList 主业务数据的list
     * @param dictList 相关字典表信息list
     * @param mainKey 主业务数据中和字典信息关联的字段,主业务表中不含有该键值的数值,则直接返回主业务数据
     * @param dictKey 字典信息中和主业务数据关联的字段,字典表中不含有该键值的数值,则直接返回主业务数据
     * @return List
     */
    public static List<Map<String, Object>> mergeList(List<Map<String, Object>> mainList,
            List<Map<String, Object>> dictList, String mainKey, String dictKey) {
        // 结果返回的List
        List<Map<String, Object>> returnList = new ArrayList<Map<String, Object>>();
        
        // 防空校验
        if (mainList == null || dictList == null) {
            return returnList;
        }
        
        // 循环主业务数据的List
        for (Map<String, Object> mainMap : mainList) {
            String mainValue = mainMap.get(mainKey) != null ? mainMap.get(mainKey).toString() : null;
            // 如果主业务表中不存在以mainKey为键值的字段则直接返回主业务数据
            if (null == mainValue) {
                return mainList;
            }
            String dictValue = "";
            // 每条主业务数据和字典表信息依次去匹配
            for (Map<String, Object> dictMap : dictList) {
                dictValue = dictMap.get(dictKey) != null ? dictMap.get(dictKey).toString() : null;
                // 如果字典表中不存在以dictKey为键值的字段则直接返回主业务数据
                if (null == dictValue) {
                    return mainList;
                }
                // 迭代字典表信息
                Iterator<Entry<String, Object>> it = dictMap.entrySet().iterator();
                // 主业务信息中比较字段的值和字典信息中比较字段的值相等则将该条字典表数据合并到当前迭代的主业务信息数据中
                if (mainValue.equals(dictValue)) {
                    while (it.hasNext()) {
                        Entry<String, Object> dictEntry = (Entry<String, Object>) it.next();
                        // 将字典表信息中和主业务信息中重复的key的字段去掉,剩余的合并到主业务信息中
                        if (!mainMap.containsKey(dictEntry.getKey())) {
                            mainMap.put(dictEntry.getKey(), dictEntry.getValue());
                        }

                    }
                    returnList.add(mainMap);
                    break;
                }
            }
        }
        // 主业务数据和字典表数据无匹配的数据也直接返回主业务数据
        return returnList.isEmpty() ? mainList : returnList;
    }
    
    /**@
     *  将相关字典表查询list信息合并到主业务查询数据List中(list数据左关联,mainList中存在匹配到dictList的数据有值,其余的没值)
     * @param mainList 主业务数据的list
     * @param dictList 相关字典表信息list
     * @param mainKey 主业务数据中和字典信息关联的字段,主业务表中不含有该键值的数值,则直接返回主业务数据
     * @param dictKey 字典信息中和主业务数据关联的字段,字典表中不含有该键值的数值,则直接返回主业务数据
     * @return List
     */
    public static List<Map<String, Object>> mergeListLeft(List<Map<String, Object>> mainList,
            List<Map<String, Object>> dictList, String mainKey, String dictKey) {
        // 结果返回的List
        List<Map<String, Object>> returnList = new ArrayList<Map<String, Object>>();
        
        // 防空校验
        if (mainList == null || dictList == null) {
            return returnList;
        }
        
        // 循环主业务数据的List
        for (Map<String, Object> mainMap : mainList) {
            String mainValue = mainMap.get(mainKey) != null ? mainMap.get(mainKey).toString() : null;
            // 如果主业务表中不存在以mainKey为键值的字段则直接返回主业务数据
            if (null == mainValue) {
                return mainList;
            }
            String dictValue = "";
            // 每条主业务数据和字典表信息依次去匹配
            int dictListSize = dictList.size();
            int currentSize = 0;
            for (Map<String, Object> dictMap : dictList) {
                dictValue = dictMap.get(dictKey) != null ? dictMap.get(dictKey).toString() : null;
                // 如果字典表中不存在以dictKey为键值的字段则直接返回主业务数据
                if (null == dictValue) {
                    return mainList;
                }
                // 迭代字典表信息
                Iterator<Entry<String, Object>> it = dictMap.entrySet().iterator();
                // 主业务信息中比较字段的值和字典信息中比较字段的值相等则将该条字典表数据合并到当前迭代的主业务信息数据中
                // 存在匹配值的时候将字典表信息加入业务表数据
                if (mainValue.equals(dictValue)) {
                    while (it.hasNext()) {
                        Entry<String, Object> dictEntry = (Entry<String, Object>) it.next();
                        // 将字典表信息中和主业务信息中重复的key的字段去掉,剩余的合并到主业务信息中
                        if (!mainMap.containsKey(dictEntry.getKey())) {
                            mainMap.put(dictEntry.getKey(), dictEntry.getValue());
                        }
                    }
                    returnList.add(mainMap);
                    break;
                    // 字典没有匹配的数据,将字典表的值清空放入业务表
                } else {
                    if (++currentSize == dictListSize) {
                        dealIterator(mainMap, it);
                        returnList.add(mainMap);
                    }
                }
            }

        }

        // 主业务数据和字典表数据无匹配的数据也直接返回主业务数据
        return returnList.isEmpty() ? mainList : returnList;
    }

    /**
     * 功能描述: <br>
     * 〈功能详细描述〉
     *
     * @param mainMap
     * @param it
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    private static void dealIterator(Map<String, Object> mainMap, Iterator<Entry<String, Object>> it) {
        while (it.hasNext()) {
            Entry<String, Object> dictEntry = (Entry<String, Object>) it.next();
            // 将字典表信息中和主业务信息中重复的key的字段去掉,剩余的合并到主业务信息中
            if (!mainMap.containsKey(dictEntry.getKey())) {
                mainMap.put(dictEntry.getKey(), null);
            }
        }
    }
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值