将两个列表合并为一个列表

4
我有一个如下的ArrayList。
ArrayList<ArrayList<String>> a = new ArrayList<ArrayList<String>>();

在包含两个字符串ArrayList的ArrayList 'a' 中。

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

如何将这两个列表合并为以下单一列表。
[a,b,c,d,1,2,3,4]

提前感谢你。

9个回答

7
你可以将foreach循环和addAll方法结合起来使用。 示例
ArrayList<String> combined = new ArrayList<String>();

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

这是如何工作的?

一个 for each 循环将遍历 Collection 中的每个成员。它有一个临时变量,即此例中的 list,将其分配给当前元素。你所做的就是将每个值中的所有元素添加到名为 combined 的一个 ArrayList 中。


4

这应该可以正常工作

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

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


2
并且给你加1分,因为你太棒了。 - christopher

4

只需使用foreach循环和addAll将所有a的内部列表迭代到result数组列表中即可。

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

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

编辑:

正如 @Lubo 指出的那样。

请注意,这种方式可能会在 ArrayList 内部创建和丢弃多个数组。如果您有大型列表(包含元素数量),请考虑查看这里:Union List


1
请注意,这种方法可能会导致许多引用“重复”。如果您有大型列表(包含元素数量),请考虑查看此处:https://dev59.com/o3VC5IYBdhLWcg3wxEJ1#13868352 - Lubo

4

我们还有其他方法,如果你能使用Apache commons-collection

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

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

2
使用ArrayList.addAll()。类似这样的代码应该有效(假设列表包含String对象;您应相应更改)。
List<String> combined = new ArrayList<String>();
combined.addAll(firstArrayList);

1
如果你需要一个可迭代对象,你可以使用 Guava
Iterables.concat(Iterable<? extends Iterable<? extends T>> inputs)

如果你确实需要一个List,你可以使用以下方法将结果Iterable转换为List:

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

或者

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

1
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列表中。


0
    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);

-1

使用Guava无需循环合并列表

使用FluentIterable.transformAndConcat

将函数应用于此流畅可迭代对象的每个元素,并返回具有结果组合的流畅可迭代对象。函数返回结果的Iterable。

用法

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接