[英]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} 那么
总时间复杂度: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.