编程技巧——多重for循环优化 目录编程技巧——多重for循环优化前言一、优化方案二、示例1.初始化数据2.双重for循环3.list结合map总结 前言 今天群友问了一个问题,多重for循环怎么优化? 然后有感而发,将平时...
<hr>
<a href="#for_0">编程技巧——多重for循环优化</a> <a href="#_8">前言</a> <a href="#_13">一、优化方案</a> <a href="#_16">二、示例</a>
<a href="#1_17">1.初始化数据</a> <a href="#2for_62">2.双重for循环</a> <a href="#3listmap_80">3.list结合map</a> <a href="#_99">总结</a>
<hr>
今天群友问了一个问题,多重for循环怎么优化? 然后有感而发,将平时编码中对于该种问题的解决方法分享出来,欢迎大家一起探讨学习!
<hr>
通过list结合map的方式降低时间复杂度,达成多层for循环的优化,文中示例为即兴编写,实际编码过程中还需要根据实际业务进行参考优化。
业务场景初步定为根据对象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;
}
代码如下(示例):
for (ClassA a : aList) {
for (ClassB b : bList) {
if (a.getAName().equals(b.getBName())){
a.setAValue(b.getBValue());
}
}
}
System.out.println(aList);
运行结果(示例):
代码如下(示例):
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);
运行结果(示例):
<hr>
由示例可以看出,两种写法运行结果是一样的,但是从时间复杂度的角度来看,双重for循环的时间复杂度为n^2,list结合map的方式时间复杂度为2n=n。如果是3层,多层呢,时间复杂度又会再上一个层级,所以合理的利用map去优化多层for循环可以有效的降低时间复杂度。
本站主要用于,日常笔记的记录,和生活日志。本站不保证所有内容信息可靠!(大多数文章属于搬运!)如有版权问题!请联系我立即删除“abcdsjx@126.com”