如何在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你在下面的后续问题中问:“解决这个问题是否有更少的内存开销的方法?因为我在列表中可能有很多元素。”考虑把它当作一个单独的堆栈溢出问题。展示你是如何使用这种方法的,并提出这个问题。我认为这是一个非常好的。