【问题标题】:Combine elements from ArrayLists合并 ArrayLists 中的元素
【发布时间】:2014-05-16 15:10:08
【问题描述】:

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

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

例如,如果我使用白色、蓝色和绿色这些颜色,则以下组合将是白色、白色、白色;白色,白色,蓝色;白色,白色,绿色;白色,蓝色,白色;等等。那么有没有办法在没有嵌套 for 循环的情况下实现这一点?

【问题讨论】:

  • 为什么不能使用嵌套循环?如果你的方格像List<List<Colour>> 这样的结构,你可以轻松地做类似for(List<Colour> colours : squares) { for(Colour colour : colours) { ... } }

标签: java for-loop arraylist colors


【解决方案1】:

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

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]。再次遇到基本情况,因此将其打印出来。

它会继续这样做,直到打印完所有组合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    相关资源
    最近更新 更多