繁体   English   中英

如何将 ArrayList 附加到另一个 ArrayList?

[英]How to prepend ArrayList to another ArrayList?

I am looking to prepend the elements of a java.util.ArrayList L1 to another java.util.ArrayList L2 and I cannot find an out of the box way to do it. 我不想创建第三个 ArrayList 并随意修改,因为 L2 是视图层中使用的列表。 Neither java.util.Collections nor org.apache.commons.collections.CollectionUtils has such a utility method (as far as I can see).

如何使用现有的 API 有效地将 ArrayList 附加到另一个 ArrayList? 对于 java 7 环境。

PS: addAll追加,我想前置。

subList为您提供列表的视图。 如果您在列表的最开始创建一个视图, addAll将做正确的事情。

ArrayList<String> list = new ArrayList<String>(Arrays.asList("extant1", "extant2"));
ArrayList<String> prefix = new ArrayList<String>(Arrays.asList("prefix1", "prefix2"));

list.subList(0, 0).addAll(prefix);
list
// => list ==> [prefix1, prefix2, extant1, extant2]

使用List#addAll(int,Collection)

将指定集合中的所有元素插入此列表中指定的 position(可选操作)。 将当前位于该 position 的元素(如果有)和任何后续元素向右移动(增加它们的索引)。 新元素将按照指定集合的迭代器返回的顺序出现在此列表中。 如果在操作正在进行时修改了指定的集合,则此操作的行为是未定义的。 (请注意,如果指定的集合是这个列表,并且它是非空的,则会发生这种情况。)

如果您使用0作为索引,它会将给定的Collection添加到List之前。 例如:

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>();
        List<String> list2 = new ArrayList<>();

        list1.add("Item #1");
        list1.add("Item #2");

        list2.add("Item #3");
        list2.add("Item #4");

        System.out.println("List #1: " + list1);
        System.out.println("List #2: " + list2);

        list2.addAll(0, list1);

        System.out.println("Combined List: " + list2);

    }
}

Output:

List #1: [Item #1, Item #2]
List #2: [Item #3, Item #4]
Combined List: [Item #1, Item #2, Item #3, Item #4]

检查docs.oracle向我展示了一个 function。 ArrayList.add(int index, E element)这很有帮助,因为您可以将 ArrayList 的项目放在数组的开头,例如:

ArrayList <Integer> L1 = {2, 3, 5, 7} /*Imaginary declaration*/, L2 = {500, 600}; 
for(int i=0; i<L1.size(); i--) L2.add(0, L1.get(i));

但这将使 L2 保留 {7, 5, 3, 2, 500, 600},因为在索引 [0] 处添加的每个元素都会将下一个元素向前推。 相反,以相反的方式执行: for(int i=L1.size()-1; i>=0; i++) L2.add(0, L1.get(i));

我没有看到任何特定的内置 function 可以做到这一点。 这是我解决这个问题的技巧。 如果 L1 是 {1,2} 而 L2 是 {3,4} 那么

  1. 反转列表 L1 (它将变为 {2,1} )
  2. 从后面迭代列表 L2 并将元素添加到 L1。 (您也可以反转 L2 并在 L1 上执行 addAll。如果您可以修改 L2,请执行此操作)(L1 将变为 {2,1,4,3} )
  3. 反转列表 L1(L1 将变为 {3,4,1,2} )

总时间复杂度:O(m+n),其中 m 是 L1 的大小,n 是 L2 的大小

        List<Integer> li1 = new ArrayList<>();
        li1.add(1);
        li1.add(2);

        List<Integer> li2 = new ArrayList<>();
        li2.add(3);
        li2.add(4);

        Collections.reverse(li1);
        ListIterator<Integer> listIterator = li2.listIterator(li2.size());
        while (listIterator.hasPrevious())
        {
            Integer previous = listIterator.previous();
            li1.add(previous);
        }
        Collections.reverse(li1);
        System.out.println(li1);

您可以这样做:

List<String> l1 = new ArrayList<>();
List<String> l2 = new ArrayList<>();

l1.add("a");
l1.add("b");

l2.add("c");
l2.add("d");

l1.addAll(l2);

System.out.println(l1); // if you want result in list 1

l2.clear();

l2.addAll(l1);

System.out.println(l2); // if you want result in list 2

如果您不想使用 Collections.addAll(int index, Collection c)

public static void main(String[] args) {

            List<String> orginalList = new ArrayList<>(Arrays.asList( "E","F","G","H"));
            System.out.println(orginalList);

            Collections.reverse(orginalList);

            List<String> newList = new ArrayList<>(Arrays.asList( "A","B","C","D"));
            System.out.println(newList);

            Collections.reverse(newList);
            orginalList.addAll(newList);

            Collections.reverse(orginalList);
            System.out.println(orginalList);



        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM