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

时间:2014-01-09 08:42:59

标签: java list collections merge

我有一个如下的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]

提前致谢。

9 个答案:

答案 0 :(得分:7)

您合并了foreach循环和addAll方法。

实施例

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

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

这是如何运作的?

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

答案 1 :(得分:4)

这应该有效

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

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

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:2)

使用a循环和foreachaddAll arraylist

遍历result的所有内部列表
ArrayList<String> merged = new ArrayList<String>();

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

答案 4 :(得分:2)

使用ArrayList.addAll()。像这样的东西应该工作(假设列表包含String对象;你应该相应地改变)。

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

答案 5 :(得分:1)

如果您需要Iterable,可以使用Guava

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

如果你真的需要一个List,你可以使用这个将结果Iterable转换为List:

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

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

答案 6 :(得分:0)

将没有循环的列表与Guava

合并

使用FluentIterable.transformAndConcat

  

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

用法

List<String> combined = FluentIterable.from(a)
        .transformAndConcat(new Function<List<String>, List<String>>() {
            @Override
            public List<String> apply(List<String> elem) {
                return Arrays.asList(elem.toArray(new String[elem.size()]));
            }
        }).toList();

System.out.println(combined.toString());

结果

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

依赖

'com.google.guava:guava:15.0'

答案 7 :(得分:0)

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 :(得分: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);