2014-07-17 93 views
0

我無法獲得此方法來修改ArrayList,然後返回修改後的ArrayList。ArrayList不會在通過方法運行後返回修改

public static ArrayList<Integer> sortAndRemoveDuplicates(ArrayList<Integer> list) { 
     list = new ArrayList<Integer>(new HashSet<Integer>(list)); 
     Collections.sort(list); 
     //System.out.println(list); 
     return list; 
} 

當我取消的系統調用,我可以看到的是,ArrayList中被修改,而我知道,我的方法的作品,但是當我通過主運行的方法ArrayList中不受影響。爲什麼是這樣?我究竟做錯了什麼?

爲什麼不是這個修改版本的工作?

public static ArrayList<Integer> sortAndRemoveDuplicates(ArrayList<Integer> list) { 
    ArrayList<Integer> newList = new ArrayList<Integer>(new HashSet<Integer>(list)); 
    Collections.sort(newList); 
    System.out.println(newList); 
    return newList; 
} 
+0

**你是怎麼稱呼它的?你抓住返回的列表嗎? –

+0

我認爲你的期望沒有得到滿足,因爲Java中的所有東西都是通過價值傳遞的。 – JamesB

回答

1

您是從傳遞的列表中創建新ArrayList所以你需要趕上結果返回

List<Integer> result = sortAndRemoveDuplicates(inputList) 
+0

那麼我在我的方法中運行我的方法嗎? – aeipownu

+0

您需要將結果重新分配給 –

1

的Java passes references by value。您正在將指向初始列表的輸入引用重新分配給另一個對象。原始列表將保持指向原始的ArrayList對象。

您需要分配這個新創建的列表回到原來的參考:

originalList = sortAndRemoveDuplicates(originalList); 

編輯:或者,因爲你是不是值返回給調用方法(main),你可以讓你的方法的返回類型void和修改您的輸入列表如下:

public static void sortAndRemoveDuplicates(List<Integer> list) { 
    List<Integer> newList = new ArrayList<Integer>(new HashSet<Integer>(list)); 
    Collections.sort(newList); 
    System.out.println(newList); 
    list.clear(); 
    for(Integer integer : newList) { 
     list.add(integer); 
    } 
} 

注意:這是01最佳實踐而不是具體實現,即讓newListList而不是ArrayList

+0

這是否在我的方法中? – aeipownu

+0

不,在'main'中你可以調用你的方法。 – manouti

+0

我將如何解決我的方法中的問題? – aeipownu

0

我認爲你的期望沒有得到滿足,因爲Java中的所有東西都是按值傳遞的,所以對列表的修改是複製的,而不是你的原始列表。除非您返回並捕獲修改後的副本,否則從方法返回時不會看到調用代碼中的更改。