0

这是我的第一篇文章,如果我犯了任何错误,请原谅我。

在我编写的这个程序中,用户从键盘一次输入一个整数,例如 2 4 5 1 3。如果在任何其他方法之前调用 reverse 方法将返回 3 1 5 4 2。但是,如果调用 sort 方法,给我们 1 2 3 4 5,然后调用 reverse 方法,我们得到 5 4 3 2 1。即使在调用其他方法之后,任何想法如何获得反向以返回原始输入的相反顺序?

   public static void reverse(ArrayList<Integer> num) {
        ArrayList<Integer> newNum= new ArrayList<Integer>();
        newNum = num;   

        Collections.reverse(newNum);
        System.out.println(newNum); 
    }
4

4 回答 4

2

每次你这样做:

newNum = num;

你的意思与newNum相同。您对其中一个所做的任何更改或将反映在另一个中。它们是同一个实例。ArrayListnumnewNumnumArrayList

您可能想要构造一个ArrayList包含相同元素的新实例。

ArrayList<Integer> newNum = new ArrayList<Integer>(num);
于 2013-04-26T01:27:54.377 回答
1

为什么没有两个数组列表...一个是最后一次操作的结果,一个是给定的原始集合。因此,结果总是会改变,而原来的会保持不变。

于 2013-04-26T01:27:39.517 回答
1

如果您想保存以供以后使用,您必须在开始弄乱它之前复制用户输入的内容。

public static void main(String[] args) {

ArrayList<Integer> num = new ArrayList<Integer>();
ArrayList<Integer> numStartingList; 

//stuff about reading the variable in here

numStartingList = new ArrayList<>(num); 

// read options and show output
}
于 2013-04-26T01:27:56.610 回答
0

在您调用 newNum = num 的每个方法中,您都放弃了对刚刚“新建”的数组列表的引用,并将 newNum 指向“num”的内存位置(或执行所谓的“浅拷贝”。你对 newNum 所做的任何事情都是对 num 做的,反之亦然。

相反,您想制作 num 数组的“深拷贝”。我建议将每个方法的前两行替换为调用私有方法,执行如下操作:

private ArrayList<Integer> copyList(ArrayList<Integer> in) { 
    ArrayList<Integer> out = new ArrayList<Integer>();
    for (int i : in) {
        out.add(i);
    }
    return out;
}

虽然我还没有检查过它的正确性。

祝你好运!

于 2013-04-26T01:37:47.440 回答