2013-04-26 65 views
0

这是我的第一篇文章,所以请原谅我,如果我有任何错误。Java排序程序

在我编写的这个程序中,用户每次从键盘输入一个整数,例如 2 4 5 1 3。 如果在任何其他方法之前调用该方法,则返回3 1 5 4 2.但是,如果调用排序方法,给我们1 2 3 4 5,则调用相反的方法,我们得到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); 
    } 

回答

2

你这样做每次:

newNum = num; 

您正在newNum指向同一个ArrayListnum。对newNumnum所做的任何更改都会反映在另一个中。他们是相同的ArrayList实例。

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

ArrayList<Integer> newNum = new ArrayList<Integer>(num); 
+0

非常感谢,我看到你注意到我尝试创建新的数据集来修改数据,而不是与原始数据混淆。这对我有效。再次感谢。 – 2013-04-26 01:40:29

1

为什么不能有两个的ArrayList ... 一个与上次操作的结果,另一个是给出了原来设定。因此,结果总是会改变,原来的结果将保持不变。

+1

创建新的ArrayLists是门票!谢谢! – 2013-04-26 01:41:11

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 
} 
+0

感谢您的回复! – 2013-04-26 01:41:28

0

在你的每一个方法,当你调用newNum = NUM​​,你放弃参考你只是“newed”数组列表,并在“编号”(内存位置指示newNum或做什么所谓“浅拷贝。”你做的任何newNum正在做NUM,反之亦然。

相反,你想使你的民阵的“深层复制”。我建议更换前两每种方法的线路都通过调用私有方法执行如下操作:

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

虽然我没有检查正确性。

祝你好运!

+0

感谢您的回复。我似乎已经通过使用上述建议并创建一个新的ArrayList实例并在其上调用我的方法来解决问题。我会记住“深”和“浅”的副本以供将来参考,这些对我来说都是新词。 – 2013-04-26 01:47:23

+0

我认为在这里使用深浅拷贝是不合适的。这些用于描述克隆对象的过程,其中深层副本将遍历对象图及其所有属性以生成每个部分的副本。 – Romski 2013-04-26 02:36:28