【问题标题】:List merge individually each cell列表单独合并每个单元格
【发布时间】:2018-08-30 01:46:10
【问题描述】:

假设我有 2 个这样定义的列表:

  • 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 个条目,则运行将需要很长时间。

如果有人知道如何提高运行时间?

感谢您的帮助。

【问题讨论】:

    标签: java algorithm


    【解决方案1】:

    你目前的做法是我所知道的最有效的方式。可能性的数量是 n^2(如果列表大小相同)或 n * m(如果它们不同);因此,它的运行时间为 O(n^2) 或 O(n * m),当您添加更多变量时,运行时间应该呈指数增长。

    【讨论】:

      【解决方案2】:

      您可以尝试并行合并。我不能确切地说在您的特定情况下性能会提高多少。但值得一试:

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

      【讨论】:

        猜你喜欢
        • 2011-05-19
        • 2021-08-10
        • 1970-01-01
        • 1970-01-01
        • 2020-08-27
        • 2015-10-06
        • 2018-03-21
        相关资源
        最近更新 更多