Java ArrayList正在随机更新
我有一个简单的程序来计算给定集合的所有子集 我相信这个算法是正确的。 然而,在某种程度上:Java ArrayList正在随机更新,java,arraylist,Java,Arraylist,我有一个简单的程序来计算给定集合的所有子集 我相信这个算法是正确的。 然而,在某种程度上: while (included.size()>0){ ArrayList<Integer> temp =included.remove(0); temp.add(first_element); output.add(temp); } 试一试 ArrayList not_included=getSubsets(input_set.clone()); 但这可能仍然
while (included.size()>0){
ArrayList<Integer> temp =included.remove(0);
temp.add(first_element);
output.add(temp);
}
试一试
ArrayList not_included=getSubsets(input_set.clone());
但这可能仍然不起作用,因为数组列表的泛型类型也是数组列表。搜索“深度复制”以找到100%有效的解决方案
getSubSet只返回指向相同列表的指针,因为参数相同,这就是为什么包含和不包含是相同列表的原因。Try
ArrayList not_included=getSubsets(input_set.clone());
但这可能仍然不起作用,因为数组列表的泛型类型也是数组列表。搜索“深度复制”以找到100%有效的解决方案
getSubSet只返回指向同一列表的指针,因为参数是相同的,这就是为什么Include和not_Include是相同的列表。是因为函数getSubsets是静态的吗?@ManasPaldhe与此完全无关。您应该看看Java中对象是如何被引用的,因为没有(直接)指针。这是因为函数getSubsets是静态的吗?@ManasPaldhe与此完全无关。由于没有(直接)指针,您应该看看Java中是如何引用对象的。
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));
}
}
ArrayList<ArrayList<Integer>> not_included = getSubsets(input_set.clone());