列表合并每个单元格

时间:2018-03-21 03:51:10

标签: java algorithm

假设我有两个定义如下的列表:

  • A [0] = [A01,A02]
  • A [1] = [A11,A11]
  • A [2] = [A21,A21]
  • B [0] = [B01,B01]
  • B [1] = [B11,B11]
  • B [2] = [B21,B21]

我想生成一个像这样的输出单一列表:

  • O [0] = {A01,A02,B01,B02}
  • O [1] = {A01,A02,B11,B12}
  • O [2] = {A01,A02,B21,B22}
  • O [3] = {A11,A12,B01,B02}
  • O [4] = {A11,A12,B11,B12}
  • O [5] = {A11,A12,B21,B22}
  • O [6] = {A21,A22,B01,B02}
  • O [7] = {A21,A22,B11,B12}
  • O [8] = {A21,A22,B21,B22}

到目前为止,我在每个列表上都有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个条目,则运行需要很长时间。

如果有人知道如何改善运行时间?

感谢您的帮助。

2 个答案:

答案 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及更高版本。