编程技巧——多重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循环可以有效的降低时间复杂度。