如何在JAVA中交换两个arraylist?

如何在JAVA中交换两个arraylist?,java,arraylist,Java,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; l

有两个数组列表,例如
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;
}
公共无效交换列表(ArrayList列表1、ArrayList列表2){
ArrayList tmpList=list1;
list1=list2;
list2=tmpList;
}

在您的方法中进行轻微的纠正:

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

但是你不能用你现在的方法来实现这一点。

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

还有两件事:

  • 您可能是指
    list2=tmpList,而不是
    list2=list1
  • 不能将泛型与原语一起使用,应为
    List

  • 你不能在函数中这样做,因为。 你不能创建一个整数列表,你可以创建一个整数列表

    您可以尝试以下方法来验证它是否无效:

    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;
    }
    
    publicstaticvoidmain(String…args)引发异常{
    list1=Arrays.asList(1,2,3);
    list2=Arrays.asList(4,5,6);
    System.out.println(list1);//打印1、2、3
    swapList(列表1、列表2);
    System.out.println(list1);//打印1、2、3
    }
    公共静态无效交换列表(列表1、列表2){
    列表tmpList=list1;
    list1=list2;
    list2=tmpList;
    }
    
    不,你不能那样实现它。数组也是如此。按值传递引用问题,就像前面已经解释过的其他问题一样

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

    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);
    }
    
    publicstaticvoidswaplist(列表1、列表2){
    List tmpList=新的ArrayList(list1);
    清单1.clear();
    列表1.addAll(列表2);
    清单2.clear();
    清单2.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
    }
    
    List list1=getList1Magic();
    List list2=getList2Magic();
    if(isSwapReferences()){
    //这不会影响实际列表
    列表温度=列表2;
    list2=list1;
    列表1=温度;
    }else if(isSwapListContent()){
    //这将修改列表
    swapList(list1,list2);//上面的方法
    }
    

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

    您可以从集合中使用交换方法:

    Collections.swap(Integer, list1, list2);
    

    不完全如此,请看其他两个答案。您仍然离正确答案最近。问题是Java不是按引用传递的。这是精确的解决方案,还可以自定义参数的空值(list1和list2)。请记住,这要慢得多。如果可以的话,你应该只交换引用。想到这里所有的内存和CPU都被浪费了,我会头疼。这是第1部分:如何做。第二部分:如何避免单独销售;)当然:不要使用方法交换。在已经定义了变量(局部变量或成员)的地方执行,并在那里交换引用。如果您想在一个方法中交换,那么它会变得很昂贵。和:交换的内容影响所有其他变量,这些变量包含对列表的引用。他们也看到了交换的内容。这取决于你的需求。+ 1你在下面的后续问题中问:“解决这个问题是否有更少的内存开销的方法?因为我在列表中可能有很多元素。”考虑把它当作一个单独的堆栈溢出问题。展示你是如何使用这种方法的,并提出这个问题。我认为这是一个非常好的。