2013-03-01 83 views
1

我有這個簡單的程序來計算給定集的所有子集。ArrayList得到隨機更新

該算法,我相信是正確的。 但是部分:

while (included.size()>0){ 
    ArrayList<Integer> temp =included.remove(0); 
    temp.add(first_element); 
    output.add(temp); 
} 

聲明temp.add(first_element)不必要地更新not_included。 請幫我理解爲什麼。

public class Recursion { 

    public static ArrayList<ArrayList<Integer>> getSubsets (ArrayList<Integer> input_set){ 
     ArrayList<ArrayList<Integer>> output=new ArrayList<ArrayList<Integer>>(); 

     if (input_set.isEmpty()){ 
      ArrayList<Integer> this_subset=new ArrayList<Integer>(); 
      output.add(this_subset); 
     }  
     else if (input_set.size()==1){ 
      ArrayList<Integer> empty_subset=new ArrayList<Integer>(); 
      output.add(input_set); 
      output.add(empty_subset); 
     } 
     else{ 
      int first_element=input_set.remove(0); 
      ArrayList<ArrayList<Integer>> included = getSubsets(input_set); 
      ArrayList<ArrayList<Integer>> not_included = getSubsets(input_set); 

      while (included.size()>0){ 
       ArrayList<Integer> temp =included.remove(0); 
       temp.add(first_element); 
       output.add(temp); 
      } 
      while (not_included.size()>0){ 
       output.add(not_included.remove(0)); 
      } 
     } 
     return output; 
    } 


    public static void main(String[] args) { 
     ArrayList<Integer> test= new ArrayList<Integer>(); 
     test.add(2); 
     test.add(1); 
     System.out.print(getSubsets(test)); 
    } 
} 

回答

1

嘗試

ArrayList<ArrayList<Integer>> not_included = getSubsets(input_set.clone()); 

這可能因爲你的泛型類型的數組列表也是一個數組列表中仍然沒有工作,雖然。搜索「深度複製」以找到100%的工作解決方案。

getSubSet只返回一個指向相同列表的指針,因爲參數是相同的,這就是爲什麼included和not_included是相同的列表。

+0

是因爲函數getSubsets是靜態的嗎? – 2013-03-01 13:12:08

+1

@ManasPaldhe這完全與它無關。你應該看看Java中引用對象的原因,因爲沒有(直接)指針。 – Sebastian 2013-03-01 13:14:17