【问题标题】: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);
}
查看主循环并获取其中的每个列表并添加到您的结果列表中。
【解决方案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();