合并ArrayList中的元素

时间:2014-05-16 15:10:08

标签: java for-loop arraylist colors

我知道已经为类似的问题提供了一些答案,但它们似乎都不适合我的问题。我正在制作一个程序来为Granny Squares生成图像,或者在内部有不同颜色环的正方形。

用户可以选择有多少环,因此所需的颜色数量会发生变化。因此,我不能使用嵌套的for循环来遍历每种颜色,因为for循环的数量必须改变。有没有办法为这些颜色创建组合?

例如,如果我使用白色,蓝色和绿色,则以下组合为白色,白色,白色;白色,白色,蓝色;白色,白色,绿色;白色,蓝色,白色;那么有没有办法在没有嵌套for循环的情况下完成这个?

1 个答案:

答案 0 :(得分:0)

这是一种使用递归实现此目的的算法。

public static void combine(List<Character> colors, List<Character> combination) {
    if (combination.size() == colors.size()) {
        System.out.println(combination);
    } else {
        for (char color : colors) {
            combination.add(color);
            combine(colors, combination);
            combination.remove(combination.size() - 1);
        }
    }
}

public static void main(String[] args) {
    List<Character> colors = new ArrayList<>();
    colors.add('W');
    colors.add('B');
    colors.add('G');

    combine(colors, new LinkedList<Character>());
}

colors是原始颜色列表(W,B,G)

combinations是一个在整个递归过程中不断修改的列表,用于保存当前组合。

以下是combination在第一次遇到基本情况之前会发生什么

[W] // add W, call recursively 
[W, W] // add W, call recursively 
[W, W, W] // add W, call recursively 

现在已满足基本情况,并打印[W, W, W]。然后它删除我们在列表中放入的最后一种颜色W,并将colors中的下一种颜色添加到combination,这会给出[W, W, B]。基本案例再次得到满足,因此将其打印出来。

在完成所有组合打印之前,它会继续执行此操作。