重构排列发现

时间:2014-10-07 20:02:54

标签: java refactoring

我尝试重构这段代码几个小时。

for (int i = 1; i <= 10; i++) {
        for (int ii = 2; ii <= 10; ii++) {
            if (ii > i) {
                for (int iii = 3; iii <= 10; iii++) {
                    if (iii > ii && iii > i) {
                        for (int iiii = 4; iiii <= 10; iiii++) {
                            if (iiii > i && iiii > ii && iiii > iii) {
                                for (int iiiii = 5; iiiii <= 10; iiiii++) {
                                    if (iiiii > i && iiiii > ii && iiiii > iii && iiiii > iiii) {
                                        FileUtils.writeStringToFile(file, i + " " + ii + " " + iii + " " + iiii + " " + iiiii + "\n", true);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

目标是获得两个输入整数(循环的数量(此代码中为5),以及一个数字的最大值(在这种情况下为10),但我没有想法如何实现这一点。抱歉,我的英语不完美。对我的作业有很大的帮助。

1 个答案:

答案 0 :(得分:1)

要获得可变数量的循环,您需要使用递归。这样的事情。

public static void combine(int values, int maximum, Consumer<int[]> consumer) {
    combine0(0, values, 1, maximum-values+1, new int[values], consumer);
}

static void consumer0(int index, int values, int min, int max, List<Integer> ints, Consumer<List<integer>> consumer) {
    if (index == values) {
        consumer.apply(ints);
        return;
    }
    for(int i = min; i <= max ; i ++) {
        ints[index] = i;
        comsumer0(index+1, values, min+1, max+1, ints, consumer);
    }
} 

有很多方法可以改进它,你可以只使用一个循环,但你必须使用一些数学;)

我会开始。

for (int i = 1; i <= 10; i++) {
    for (int ii = 2; ii <= 10; ii++) {
        if (ii > i) {

相同
for (int i = 1; i < 10; i++) {
    for (int ii = i+1; ii <= 10; ii++) {

当您添加更多循环时,您可以看到i不能是10或9等,就像您看到ii必须至少为2一样。