【问题标题】:Merge two list into a single list将两个列表合并为一个列表
【发布时间】:2014-01-27 17:08:50
【问题描述】:

我有一个如下的 ArrayList。

ArrayList<ArrayList<String>> a = new ArrayList<ArrayList<String>>();

其中 ArrayList 'a' 包含两个 ArrayList 的字符串,如下所示。

[a,b,c,d] & [1,2,3,4]

如何将这两个列表合并为一个列表,如下所示。

[a,b,c,d,1,2,3,4]

提前致谢。

【问题讨论】:

标签: java list collections merge


【解决方案1】:

您将foreach 循环和addAll 方法结合起来。

示例

ArrayList<String> combined = new ArrayList<String>();

for(ArrayList<String> list : a) {
    combined.addAll(list);
}

这是如何工作的?

for each 循环将遍历Collection 的每个成员。它有一个临时变量,在本例中为list,它也分配了当前元素。您所做的只是将list 的每个值中的每个元素添加到一个名为combined 的ArrayList。

【讨论】:

    【解决方案2】:

    只需使用foreach 循环和addAll 到result 数组列表遍历a 的所有内部列表

    ArrayList<String> merged = new ArrayList<String>();
    
    for(ArrayList<String> list : a){
       merged.addAll(list);
    }
    

    编辑: 正如@Lubo 指出的那样。

    请注意,这样您最终会在ArrayList 内部创建和丢弃许多数组。如果您的列表很大(包含的元素数量),请考虑查看此处:Union List

    【讨论】:

    【解决方案3】:

    这应该可以工作

    ArrayList<ArrayList<String>> a = new ArrayList<ArrayList<String>>();
            List<String> result = new ArrayList<String>();
            for (ArrayList<String> arrayList : a) {
                result.addAll(arrayList);
            }
    

    查看主循环并获取其中的每个列表并添加到您的结果列表中。

    【讨论】:

    • 感谢您的出色表现 +1。
    【解决方案4】:

    我们还有一些其他的方法,如果你可以使用 Apache commons-collection

    ListUtils.union(java.util.List list1, java.util.List list2)
    

    返回一个新列表,其中包含附加到第一个列表的第二个列表。

    【讨论】:

      【解决方案5】:

      使用 ArrayList.addAll()。这样的事情应该可以工作(假设列表包含 String 对象;您应该相应地进行更改)。

      List<String> combined = new ArrayList<String>();
      combined.addAll(firstArrayList);
      

      【讨论】:

        【解决方案6】:

        如果你需要一个Iterable,你可以使用Guava:

        Iterables.concat(Iterable<? extends Iterable<? extends T>> inputs)
        

        如果您真的需要一个列表,您可以使用以下方法将生成的 Iterable 转换为列表:

        Lists.newArrayList(Iterable<? extends E> elements)
        

        或

        Lists.newLinkedList(Iterable<? extends E> elements)
        

        【讨论】:

          【解决方案7】:

          Java 8 流提供了另一种解决方案:

          List<List<String>> list = Arrays.asList(
                  Arrays.asList("1", "2"),
                  Arrays.asList("3", "4"),
                  Arrays.asList("5", "6")
          );
          
          List<String> merged = list
                  .stream()
                  .reduce(new ArrayList<>(),(accumulator, sublist) -> {accumulator.addAll(sublist);return accumulator;});
          
          System.out.println(merged);
          

          这类似于已接受的答案:循环遍历列表(使用 Stream.reduce)将所有子列表元素添加到 merged 列表中。

          【讨论】:

            【解决方案8】:
                List<Integer> one = Arrays.asList(1, 2,3);
                List<Integer> two = Arrays.asList(4, 5,6);
                List<Integer> out = Stream.of(one, two)
                        .collect(ArrayList::new, (listStream, item) -> listStream.addAll(item), (item1, item2) -> {});
                System.out.println(out);
            

            【讨论】:

              【解决方案9】:

              使用Guava 合并不带循环的列表

              使用FluentIterable.transformAndConcat。

              将函数应用于此流式迭代的每个元素,并返回一个流式迭代与结果的连接组合。函数返回一个 Iterable 的结果。

              用法

              List<String> combined = FluentIterable.from(a)
                    .transformAndConcat(Functions.identity())
                    .toList();
              

              【讨论】:

                猜你喜欢
                • 2015-04-01
                • 2014-04-01
                • 1970-01-01
                • 2021-04-04
                • 2019-02-05
                • 1970-01-01
                • 2014-01-03
                相关资源
                最近更新 更多