2013-03-01 115 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