假设我有两个定义如下的列表:
我想生成一个像这样的输出单一列表:
到目前为止,我在每个列表上都有2个循环,并通过组合循环中的每个值创建一个新列表。
List<Map<String, Object>> newList = new ArrayList<>();
for (Map<String, Object> originalData : originalDatas) {
for (Map<String, Object> duplicateData : duplicateDatas) {
Map<String, Object> newData = new HashMap<>();
newData.putAll(originalData);
newData.putAll(duplicateData);
newList.add(newData);
}
};
只要我们没有大量数据,这项工作正常。
但是,如果两个列表都有~10000个条目,则运行需要很长时间。
如果有人知道如何改善运行时间?
感谢您的帮助。
答案 0 :(得分:1)
您目前的做法是我所知道的最有效的方式。可能性的数量是n ^ 2(如果列表具有相同的大小)或n * m(如果它们是不同的);因此,它具有O(n ^ 2)或O(n * m)的运行时,并且当您添加更多变量时,运行时间应呈指数增长。
答案 1 :(得分:1)
您可以尝试并行合并。我无法确切地说出在特定情况下性能会有多大提升。但值得一试:
List<Map<String, Object>> newList = Arrays.asList(originalData, duplicateData)
.stream()
.parallel()
.map(m -> m.entrySet().stream()
.collect(Collectors.toMap(k->k.getKey(), v->v.getValue())))
.collect(Collectors.toList());
当然,这种方法只适用于Java 8及更高版本。