【编程技巧】多重for循环优化

编程技巧——多重for循环优化



前言

今天群友问了一个问题,多重for循环怎么优化?
然后有感而发,将平时编码中对于该种问题的解决方法分享出来,欢迎大家一起探讨学习!


一、优化方案

通过list结合map的方式降低时间复杂度,达成多层for循环的优化,文中示例为即兴编写,实际编码过程中还需要根据实际业务进行参考优化。

二、示例

1.初始化数据

业务场景初步定为根据对象A和对象B的某个字段进行匹配然后更新A对象的数据。

代码如下(示例):

public class ProcessControlSkill {

    public static void main(String[] args) {
        List<ClassA> aList = new ArrayList<>();
        ClassA.ClassABuilder aBuilder = ClassA.builder();
        aBuilder.id(1).aName("1").aValue("1");
        aList.add(aBuilder.build());
        aBuilder.id(2).aName("2").aValue("2");
        aList.add(aBuilder.build());
        aBuilder.id(3).aName("3").aValue("3");
        aList.add(aBuilder.build());

        List<ClassB> bList = new ArrayList<>();
        ClassB.ClassBBuilder bBuilder = ClassB.builder();
        bBuilder.id(4).bName("1").bValue("4");
        bList.add(bBuilder.build());
        bBuilder.id(5).bName("2").bValue("5");
        bList.add(bBuilder.build());
        bBuilder.id(6).bName("3").bValue("6");
        bList.add(bBuilder.build());
    }
}

@Data
@Builder
class ClassA{
    private Integer id;
    private String aName;
    private String aValue;
}

@Data
@Builder
class ClassB{
    private Integer id;
    private String bName;
    private String bValue;
}

2.双重for循环

代码如下(示例):

        for (ClassA a : aList) {
            for (ClassB b : bList) {
                if (a.getAName().equals(b.getBName())){
                    a.setAValue(b.getBValue());
                }
            }
        }
        System.out.println(aList);

运行结果(示例):

在这里插入图片描述

3.list结合map

代码如下(示例):

        Map<String, ClassB> bMap = bList.stream().collect(Collectors.toMap(ClassB::getBName, Function.identity()));
        for (ClassA a : aList) {
            ClassB b = bMap.get(a.getAName());
            if (Objects.nonNull(b)){
                a.setAValue(b.getBValue());
            }
        }
        System.out.println(aList);

运行结果(示例):
在这里插入图片描述


总结

由示例可以看出,两种写法运行结果是一样的,但是从时间复杂度的角度来看,双重for循环的时间复杂度为n^2,list结合map的方式时间复杂度为2n=n。如果是3层,多层呢,时间复杂度又会再上一个层级,所以合理的利用map去优化多层for循环可以有效的降低时间复杂度。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值