此方法应反转ArrayList中的数字

时间:2018-11-22 14:27:15

标签: java

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”。为什么?

4 个答案:

答案 0 :(得分:5)

other = a;

创建原始List的副本。

aother都引用相同的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)

从回答中可以看到,您可以了解有关编程语言的两件事:

  1. 副本和参考之间有什么区别?看到@Eran的答案

    如果在列表上循环时更改列表中项目的顺序,则会遇到问题。

  2. 标准库和内置类型如何为您提供帮助?参见@Mahmoud Hanafy的答案

    您需要花费时间来了解语言及其生态系统可以为您提供的服务。例如,非常重要的一点是您了解reverse集合是非常普遍的事情,并且在每一行中您都必须问您:其他开发人员如何处理此问题。