Java:向ArrayList添加项时出现问题<;ArrayList<;整数>&燃气轮机;

Java:向ArrayList添加项时出现问题<;ArrayList<;整数>&燃气轮机;,java,arraylist,bit-manipulation,combinations,Java,Arraylist,Bit Manipulation,Combinations,我试图用Java编写一个程序,计算整数数组中所有元素的组合(包含5个元素),并将这些组合输出到ArrayList。我在下面包含了我的代码 我使用位运算来查找组合。每个组合都构造为一个ArrayList(整数),称为“writeitem”。然后,我想将它们存储在另一个名为“master”的ArrayList中,它的格式必须是ArrayList(ArrayList(Integer))。[由于格式原因,必须将其替换为();否则不会显示…] 尝试将每个组合保存到“主”ArrayList时会出现问题。如果

我试图用Java编写一个程序,计算整数数组中所有元素的组合(包含5个元素),并将这些组合输出到ArrayList。我在下面包含了我的代码

我使用位运算来查找组合。每个组合都构造为一个ArrayList(整数),称为“writeitem”。然后,我想将它们存储在另一个名为“master”的ArrayList中,它的格式必须是ArrayList(ArrayList(Integer))。[由于格式原因,必须将其替换为();否则不会显示…]

尝试将每个组合保存到“主”ArrayList时会出现问题。如果运行下面的代码,printf函数将显示组合构造正确。然而,一旦我要求将它“添加”到“master”中,它似乎并没有附加到“master”的末尾。相反,所有的“主”都被刚刚构造的组合的i个副本覆盖

因此,例如,如果我调用[1,2,3,4,5]上的函数,我的“主”数组最终是[1,2,3,4,5]的31个副本(要找到的第31个组合)

我想这与使用嵌套数组列表有关,有更好的方法来实现我想要的。但我也有可能犯了其他新手错误

static ArrayList<ArrayList<Integer>> master = new ArrayList<ArrayList<Integer>>();
public static void generatecombs(int[] x){

    ArrayList<Integer> writeitem = new ArrayList<Integer>(); //empty list to construct each comb

    for(int i=1;i<32;i++){

        writeitem.clear(); //clear before constructing next combination

        if((i & 1)>0){          //check if each element is present in combination
            writeitem.add(x[0]);
        }
        if((i & 2)>0){
            writeitem.add(x[1]);
        }
        if((i & 4)>0){
            writeitem.add(x[2]);
        }
        if((i & 8)>0){
            writeitem.add(x[3]);
        }
        if((i & 16)>0){
            writeitem.add(x[4]);
        }

        System.out.printf("The %dth combination is %s\n", i,writeitem);
        master.add(writeitem); //output constructed element
        System.out.printf("The collection so far is: %s\n", master);
    }
}
static ArrayList master=new ArrayList();
公共静态无效生成组件(int[]x){
ArrayList writeitem=new ArrayList();//用于构造每个梳子的空列表
对于(inti=1;i0){//检查每个元素是否以组合形式存在
writeitem.add(x[0]);
}
如果((i&2)>0){
writeitem.add(x[1]);
}
如果((i&4)>0){
writeitem.add(x[2]);
}
如果((i&8)>0){
writeitem.add(x[3]);
}
如果((i&16)>0){
增加(x[4]);
}
System.out.printf(“第%dth个组合是%s\n”,i,writeitem);
master.add(writeitem);//输出构造的元素
System.out.printf(“到目前为止的集合是:%s\n”,master);
}
}
删除clear()方法。from for循环。每次迭代后,clear()将从arraylist中删除值
将您创建的arraylist放入循环中。

在循环中移动新的arraylist

static ArrayList<ArrayList<Integer>> master = new ArrayList<ArrayList<Integer>>();

public static void generatecombs(int[] x){

    for(int i=1;i<32;i++){

        ArrayList<Integer> writeitem = new ArrayList<Integer>(); // new list to construct each comb
        if((i & 1)>0){          //check if each element is present in combination
            writeitem.add(x[0]);
        }
        if((i & 2)>0){
            writeitem.add(x[1]);
        }
        if((i & 4)>0){
            writeitem.add(x[2]);
        }
        if((i & 8)>0){
            writeitem.add(x[3]);
        }
        if((i & 16)>0){
            writeitem.add(x[4]);
        }

        System.out.printf("The %dth combination is %s\n", i,writeitem);
        master.add(writeitem); //output constructed element
        System.out.printf("The collection so far is: %s\n", master);
    }
}
static ArrayList master=new ArrayList();
公共静态无效生成组件(int[]x){
对于(inti=1;i0){//检查每个元素是否以组合形式存在
writeitem.add(x[0]);
}
如果((i&2)>0){
writeitem.add(x[1]);
}
如果((i&4)>0){
writeitem.add(x[2]);
}
如果((i&8)>0){
writeitem.add(x[3]);
}
如果((i&16)>0){
增加(x[4]);
}
System.out.printf(“第%dth个组合是%s\n”,i,writeitem);
master.add(writeitem);//输出构造的元素
System.out.printf(“到目前为止的集合是:%s\n”,master);
}
}

writeitem的构造移动到for循环内。您不想重复使用同一数组。

另一个解决方案是在清除writeItem之前,在添加到父列表时进行克隆

master.add(writeitem.clone()); 

您获得31份拷贝的原因是,您正在运行for循环,每次清除
writeitem
数组,将其添加到其中,并在仍处于for循环时将其打印出来,然后再重复30次,直到我达到32次


删除
writeitem.clear()并查看您的处理情况

不,清除是必要的。将清除替换为新的循环内部。否,克隆将返回此LinkedList的浅层副本。谢谢!感谢所有人的回答,现在它起作用了,我知道我做错了什么。谢谢。这澄清了我的错误。我没有意识到一旦“writeitem”被输出到“master”,它仍然在“master”中被称为“writeitem”,因此每次都会被修改。