如何在Java中循环遍历?

时间:2010-03-24 13:06:48

标签: java loops cycle

我想对以下要素进行循环:

[1,2,11,12,21,22,111,112,121,122,...,222222]

或者例如

[1,2,3,11,12,13,21,22,23,31,32,33,111,112,113,... 333333333]

如何在Java中创建它?在我的特定情况下,我使用4位数字(1,2,3,4),最后一位数字的长度可以是1到10。

我设法用Python和PHP做到了。在第一种情况下,我使用列表列表。我从[[1],[2],]开始,然后对于列表中的每个元素,我添加了1和2,所以我得到了[[1,1],[1,2],[2,1],[2] ,2]]等等:

nchips = sum(chips)
traj = [[]]
last = [[]]    
while len(last[0]) < nchips:
    newlast = []
    for tr in last:
        for d in [1,2,3,4]:
        newlast.append(tr + [d])
    last = newlast
    traj += last

当我在PHP中使用它时,我使用了基数为3的数字。但这是一个棘手且不优雅的解决方案。

    for ($i=-1; $i<=$n; $i+=1) {

    if ($i>-1) {
        $n5 = base_convert($i,10,5);
        $n5_str = strval($n5);
        $tr = array();
        $found = 0;
        for ($j=0; $j<strlen($n5_str); $j+=1) {
        $k = $n5_str[$j];
        if ($k==0) {
            $found = 1;
            break;
        }
        array_push($tr,$k);
        }
        if ($found==1)
        continue;
    } else {
        $tr = array();
    }
}

可以在Java中轻松完成吗?

4 个答案:

答案 0 :(得分:5)

这看起来非常像在给定基数中使用数字计算。 (示例的基数为2和3)您可以使用Integer.toString轻松地将整数转换为给定基数的字符串,并将该字符串的字符映射到符号。例如:

Integer.toString(6, 2) -> "011"

将此字符串映射到字符数组,然后将该数组映射到符号。在您的情况下,将是:'0' - &gt; 1和'1' - &gt; 2。

这不是最有效的解决方案,但它允许Integer.toString执行脏工作,让您进行简单的数组转换。

要转换另一种方法,可以从数组转换为字符串,然后使用Integer.parseInt再次提取int表示。

如果你需要执行算术(我猜主要是++和 - 对于循环的前一个和下一个元素),在整数上进行它们并根据需要来回转换。

免责声明:我没有在java中编码一段时间,因此方法和类名可能会关闭。

编辑:如果需要的符号数多于32位和64位整数,则可以使用big int。

对评论的回应:

正如人们所评论的那样,这种方法存在前导零问题。显而易见的解决方案是在转换为字符串之前向整数表示添加一些值N ^(n + 1),其中N是基数,n是符号数。这将有效地将1,1,2转换为1001而不是001,从而有效地允许零。

但是这样做的缺点是成为一个过于复杂的解决方案,实际上就像它最初想要的简单解决方案一样。

答案 1 :(得分:2)

public class Cycle {
    static void advance(StringBuilder sb, int B) {
        int pos = sb.length();
        while (--pos != -1 && sb.charAt(pos) == '0' + B) {
            sb.setCharAt(pos, '1');
        }
        if (pos == -1) {
            sb.insert(++pos, '0');
        }
        sb.setCharAt(pos, (char) (sb.charAt(pos) + 1));
    }

    public static void main(String args[]) {
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < 20; i++) {
            advance(sb, 3);
            System.out.println(sb);
        }
    }
}

推进工作如下:

  • 从右到左(--pos
  • 将所有B翻转到1 s
  • 直到找到小于B的内容或者你发现了pos == -1
  • 如果您碰壁,请插入0
  • pos
  • 处的增量字符

答案 2 :(得分:1)

如果你不关心生成顺序(我的意思是它首先生成1; 11; 111,在生成1; 2; 3之前)使用这个:

public static void gen(int level) {
    if (level > 0) {
        for (int i = 0; i < level; i++)
            System.out.print(arr[i] + " ");     
        System.out.println();
    }

    if (level == 10)
        return;

    for (int i = 1; i <= 4; i++) {
        arr[level] = i;
        gen(level + 1);
    }
}

public static void main(String[] args)  {
    gen(0);
}

但如果你关心订单,请使用:

private static int top;
private static int[] arr = new int[10]; 

public static void gen(int level) {
    if (level == top) {

        for (int i = 0; i < level; i++)
            System.out.print(arr[i] + " ");
        System.out.println();

        return;
    }

    for (int i = 1; i <= 4; i++) {
        arr[level] = i;
        gen(level + 1);
    }
}

public static void main(String[] args)  {
    for (top = 1; top <= 10; top++)
        gen(0);
}

答案 3 :(得分:1)

我相信你的任务是一个组合任务,你应该实现组合算法来找到给定数字(1,2,3,4)的唯一组合 - 并将这个算法从1迭代到所需的长度。

我无法想象你可以在这里使用Java的哪些特定功能。它将是一些迭代器。

关于算法的讨论,我建议你阅读Algorithm to return all combinations of k elements from n