2013-04-26 114 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