import java.util.*;
public class Metodo {
public static void main(String[] args) {
ArrayList<Integer> a = new ArrayList();
a.add(1);
a.add(2);
a.add(3);
a.add(4);
a.add(5);
Metodo.inverte(a);
for(int i=0; i<a.size(); i++) {
System.out.println(a.get(i));
}
}
public static void inverte(ArrayList<Integer> a) {
ArrayList<Integer> other = new ArrayList();
other = a;
for(int i=0; i<a.size(); i++) {
a.set(i, other.get(other.size()-i-1));
}
}
}
此方法应转换ArrayList中的数字,因此应打印“ 5 4 3 2 1”,但应打印“ 5 4 3 4 5”。为什么?
答案 0 :(得分:5)
other = a;
不创建原始List
的副本。
a
和other
都引用相同的List
对象,因此,当您调用a.set(0,other.get(other.size()-1)
时,会丢失other.get(0)
的原始值。
您应该使用:
ArrayList<Integer> other = new ArrayList<>(a);
创建原始List
的副本并删除other = a;
答案 1 :(得分:2)
伊兰(Eran)已经回答了这个问题,但是这里有一个简单的注释。您可以使用以下方法反转ArrayList:
Collections.reverse(arrayList)
答案 2 :(得分:2)
您可以按相反的顺序将a
的项目添加到other
中,并将结果return
添加到public static ArrayList<Integer> inverte(ArrayList<Integer> a) {
ArrayList<Integer> other = new ArrayList<>();
for(int i = a.size() - 1; i >=0 ; i--) {
other.add(a.get(i));
}
return other;
}
a = Metodo.inverte(a);
所以您这样做:
{{1}}
答案 3 :(得分:0)
从回答中可以看到,您可以了解有关编程语言的两件事:
副本和参考之间有什么区别?看到@Eran的答案
如果在列表上循环时更改列表中项目的顺序,则会遇到问题。
标准库和内置类型如何为您提供帮助?参见@Mahmoud Hanafy的答案
您需要花费时间来了解语言及其生态系统可以为您提供的服务。例如,非常重要的一点是您了解reverse
集合是非常普遍的事情,并且在每一行中您都必须问您:其他开发人员如何处理此问题。