在JAVA中,我该如何交换两个ArrayList?

4
有两个ArrayList,例如:list1 = {1,2,3}list2 = {7,6,4,2}。如何交换这两个列表,以便结果为list1 = {7,6,4,2}list2 = {1,2,3}
可以像这样实现:
public void swapList(ArrayList<Integer> list1, ArrayList<Integer> list2){
    ArrayList<Integer> tmpList = list1;
    list1 = list2;
    list2 = tmpList;
}

+1 你在下面提出了一个后续问题:“有没有更少的内存成本来解决这个问题?因为我的列表中可能有很多元素。” 考虑将其作为单独的StackOverflow问题提出。展示你如何使用这种方法并提出这个问题。我认为这是一个非常好的问题。 - Erick Robertson
5个回答

14
不,你不能像那样实现它。数组也是如此。传递引用的值问题,就像其他人已经解释过的那样。
如果您想要交换列表的内容,则必须清除并复制:
public static void swapList(List<Integer> list1, List<Integer> list2){
    List<Integer> tmpList = new ArrayList<Integer>(list1);
    list1.clear();
    list1.addAll(list2);
    list2.clear();
    list2.addAll(tmpList);
}
一些额外的想法:
List<Integer> list1 = getList1Magic();
List<Integer> list2 = getList2Magic();

if (isSwapReferences()) {
  // this does not affect the actual lists
  List<Integer> temp = list2;
  list2 = list1;
  list1 = temp;
} else if (isSwapListContent()) {
  // this modifies the lists
  swapList(list1, list2);  // method from above
}

交换策略取决于您的需求。第一个块具有局部效应,第二个块具有全局效应。


这是一个精确的解决方案,还可以为参数(list1和list2)的空值进行定制。 - Goran Nastov
请记住,这样做会慢很多。如果可以的话,你应该只交换引用。 - Piotr Praszmo
想到这里浪费的所有内存和CPU,我的脑袋都要炸了。 - Erick Robertson
2
这是“如何操作”的第一部分。第二部分“如何避免”需要单独购买 ;) - Andreas Dolk
有没有更省内存的方法来解决这个问题?因为我的列表中可能有很多元素。 - Renjun Zou
1
当然:不要使用一个方法来交换。在你定义变量(局部变量或成员)的地方进行交换引用。如果你想在一个方法中进行交换,那么它会变得很昂贵。并且,交换的内容会影响到所有持有列表引用的其他变量。它们也会看到交换后的内容。所以这取决于你的需求。 - Andreas Dolk

4
你解决方案的问题在于Java是一种传值调用的语言,所以对list1list2变量的任何更改都不会影响方法外部的结果,但如果这不是在方法内部进行的话,那就可以了。
还有两点需要注意:
1. 你可能想使用list2 = tmpList;而不是list2 = list1;
2. 你不能将基本类型用作泛型参数,应该使用List<Integer>

不完全正确,可以看看其他两个答案。但是你离正确答案最近。 - Boris Strandjev
6
问题在于 Java 不是 按引用传递。 - Thilo

2
由于Java仅按值传递,因此您无法在函数中执行此操作。而且,您不能创建整数列表,但可以创建Integer列表。
您可以尝试使用以下代码验证它是否不工作:
public static void main(String... args) throws Exception {
    List<Integer> list1 = Arrays.asList(1, 2, 3);
    List<Integer> list2 = Arrays.asList(4, 5, 6);
    System.out.println(list1); //prints 1, 2, 3
    swapList(list1, list2);
    System.out.println(list1); //prints 1, 2, 3
}

public static void swapList(List<Integer> list1, List<Integer> list2){
    List<Integer> tmpList = list1;
    list1 = list2;
    list2 = tmpList;
}

0

你的方法有一个小错误:

    ArrayList<Integer> tmpList = list1;
    list1 = list2;
    list2 = tmpList;

但是你不能以你当前的方法这样做。


-3
你可以使用 Collections 中的 swap 方法:
Collections.swap(Integer, list1, list2);

这不是swap的工作方式。 - oers

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