使用 HashMap 优化嵌套循环:Java 对象数组转换
本文旨在提供使用 HashMap 优化 Java 嵌套循环的有效方法特别是当循环涉及对象数组并进行相等检查时。通过将内部循环转换为 HashMap 查询可以显著降低时间复杂性提高代码性能。本文将提供详细的步骤和示例代码以帮助读者理解和应用此优化技能。包括嵌套循环在内的处理 Java 特别是当需要对两个对象列表进行比较并根据特定条件进行匹配时性能往往成为一个关键问题。 传统嵌套循环方法的时间复杂性是 O(n*m)其中 n 和 m 两个列表的长度。当列表很大时这种方法可能会变得非常耗时。本文将介绍如何使用它 HashMap 优化这类代码将时间复杂度降低到接近 O(nm)。问题描述假设我们有两个 Java Object1的对象 和 Object2。Object1 包括字符串属性和一个字符串属性 Object2 列表。我们的目标是遍历 Object1 列表为每一个 Object1 找到所有名称属性匹配的对象 Object2 对象然后把这些 Object2 对象添加到 Object1 的列表中。立即学习“Java免费学习笔记(深入)public class Object1 { String name; String xyz; ListObject2 listobject2; public String getName() { return name; } public void setlistobject2(ListObject2 listobject2) { this.listobject2 listobject2; } } public class Object2 { String name; String abc; String def; public String getName() { return name; } }实现嵌套循环的传统方法是public void fillNestedObject() { ListObject1 listobjectt1 new ArrayList(); // 假设 fetchobjects1FromApi() 从 API 获取 Object1 列表 // 实际使用时请替换为真实数据源 listobjectt1.add(new Object1(); listobjectt1.get(0).name test; ListObject2 listobject2 new ArrayList(); // 假设 fetchobjectsFromapi2 从 API 获取 Object2 列表 // 实际使用时请替换为真实数据源 Object2 obj2 new Object2(); obj2.name test; listobject2.add(obj2); for(Object1 object1 : listobjectt1){ ListObject2 tmpList new ArrayList(); for(Object2 object2 : listobject2) { if(object1.getName().equals(object2.getName())){ tmpList.add(object2); } } object1.setlistobject2(tmpList); } }使用 HashMap 优化我们可以使用上述代码进行优化 HashMap 来存储 Object2 对象以其 name 属性作为键。这样我们就可以了 O(1) 在复杂的时间内搜索和 Object1 对象匹配的 Object2 对象从而避免内部循环。以下是使用 HashMap 优化代码import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class NestedLoopOptimization { public void fillNestedObject() { ListObject1 listobjectt1 new ArrayList(); // 假设 fetchobjects1FromApi() 从 API 获取 Object1 列表 // 实际使用时请替换为真实数据源 Object1 obj1 new Object1(); obj1.name test; listobjectt1.add(obj1); ListObject2 listobject2 new ArrayList(); // 假设 fetchObjectfromApi2() 从 API 获取 Object2 列表 // 实际使用时请替换为真实数据源 Object2 obj2 new Object2(); obj2.name test; listobject2.add(obj2); // 创建一个 HashMap以 Object2 的 name Object2作为键的属性 对象作为值 MapString, ListObject2 object2Map new HashMap(); for (Object2 object2 : listobject2 { if (!object2Map.containsKey(object2.getName())) { object2Map.put(object2.getName(), new ArrayList()); } object2Map.get(object2.getName()).add(object2); } // 遍历 Object1 列表并使用 HashMap 查找匹配的 Object2 对象 for (Object1 object1 : listobject1 { ListObject2 tmpList object2Map.getOrDefault(object1.getName(), new ArrayList()); object1.setlistobject2(tmpList); } } }代码解释创建 HashMap: 我们先创造一个 HashMap object2Map用于存储 Object2 对象。键是 Object2 对象的 name 属性值是相同的 name 属性的 Object2 对象列表。填充 HashMap: 我们遍历 listobject2每个 Object2 对象添加到 object2Map 中。如果 object2Map 同样的存在已经存在 name 属性键则将 Object2 将对象添加到键对应的值列表中。否则创建新列表并将其添加到键对应的值列表中 Object2 将对象添加到列表中然后将键添加到列表中 object2Map 中。使用 HashMap 寻找匹配对象 我们遍历 listobject1并使用 object2Map.get(object1.getName()) 查找与 Object1 对象匹配的 Object2 对象列表。getOrDefault 该方法用于处理 object1.getName() 在 object2Map 在不存在的情况下此时返回新的空列表。设置 Object1 的 List: 最后会找到的 Object2 列表设置在相应的位置 Object1 对象的 listobject2 属性中。使用 Java 8 Stream 优化 (原答案)import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; public class NestedLoopOptimization { public void fillNestedObject() { ListObject1 listobjectt1 new ArrayList(); // 假设 fetchobjects1FromApi() 从 API 获取 Object1 列表 // 实际使用时请替换为真实数据源 Object1 obj1 new Object1(); obj1.name test; listobjectt1.add(obj1); ListObject2 listobject2 new ArrayList(); // 假设 fetchobjectsFromapi2 从 API 获取 Object2 列表 // 实际使用时请替换为真实数据源 Object2 obj2 new Object2(); obj2.name test; listobject2.add(obj2); StreamObject1 stream1 listobjectt1.stream(); StreamObject2 stream2 listobject2.stream(); MapString, ListObject2 reduced2 Collections.unmodifiableMap( stream2.reduce(new HashMap(), (a, b) - { if (!a.containsKey(b.getName())) { a.put(b.getName(), new ArrayList()); } a.get(b.getName()).add(b); return a; }, (a, b) - b)); stream1.peek(object1 - object1.setListObject2(reduced2).get(object1.getName()))) .collect(Collectors.toList()); } }代码解释Stream 版本转换为 Stream: 首先将 listobjectt1 和 listobject2 转换为 Stream 对象。Reduce 成 Map: 使用 stream2.reduce 将 Object2 的 Stream 对象转换为一个 Map其中 key 是 Object2 的 name 属性value 是具有相同 name 属性的 Object2 对象列表类似于以前手动创建的操作。 HashMap 但是使用了这个过程 Stream 聚合操作。Collections.unmodifiableMap 用于确保 Map 不可变性。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2456717.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!