如何在JAVA中交换两个arraylist?

时间:2012-02-28 12:05:59

标签: java arraylist

有两个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;
}

5 个答案:

答案 0 :(得分:12)

不,你不能那样实现它。与数组相同。像其他人已经解释的那样,通过价值传递问题。

如果您希望列表交换内容,则必须清除并复制:

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
}

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

答案 1 :(得分:4)

您的解决方案存在的问题是Java是一种按值传递语言。因此,对list1list2变量的任何更改都不会在方法之外产生影响,但如果这不在方法中,则可以。

还有两件事:

  1. 您可能需要list2 = tmpList;,而不是list2 = list1;
  2. 您不能将通用与原语一起使用,应该是List<Integer>

答案 2 :(得分:2)

由于Java is pass by value only,您无法在函数中执行此操作。 而且你不能创建一个int的列表,你可以创建一个整数列表。

您可以尝试此操作来验证它不起作用:

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;
}

答案 3 :(得分:0)

您的方法中的小修正:

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

但你不能按照你的方式做到这一点。

答案 4 :(得分:-1)

您可以使用Collections中的swap方法:

Collections.swap(Integer, list1, list2);