有两个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;
}
答案 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是一种按值传递语言。因此,对list1
和list2
变量的任何更改都不会在方法之外产生影响,但如果这不在方法中,则可以。
还有两件事:
list2 = tmpList;
,而不是list2 = list1;
。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);