2

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

我使用按位运算来查找组合。每个组合都构造为一个 ArrayList(Integer),称为“writeitem”。然后我想将这些存储在另一个 ArrayList 中,称为“master”,它必须具有 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);
    }
}
4

5 回答 5

1

在循环内移动新的

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);
    }
}
于 2013-10-02T22:28:19.030 回答
0

删除 clear() method.from for loop.after 每次迭代 clear() 从 arraylist 中删除值,将你的 arraylist 创建放入 for 中。

于 2013-10-02T22:26:26.507 回答
0

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

master.add(writeitem.clone()); 
于 2013-10-02T22:30:29.033 回答
0

你得到 31 个副本的原因是因为你正在运行 for 循环,writeitem每次都将数组擦干净,添加到它,然后在 for 循环中打印出来,然后再重复 30 次,直到我命中 32。

删除writeitem.clear();并查看您如何继续使用它

于 2013-10-02T22:31:45.460 回答
0

移动writeitemfor 循环内部的构造。您不想重复使用相同的数组。

于 2013-10-02T22:28:41.767 回答