在Java中,如何在循环上创建循环?

在Java中,如何在循环上创建循环?,java,loops,cycle,Java,Loops,Cycle,我想在以下元素上做一个循环: [1,2,11,12,21,221111112121122,…,2222222] 比如说 [1,2,3,11,12,13,21,22,23,31,32,3311112113,…333] 我如何用Java制作它?在我的特殊情况下,我使用4位数字(1,2,3,4),最后一个数字的长度可以是1到10 我设法用Python和PHP实现了这一点。在第一种情况下,我使用列表覆盖列表。我从[[1],[2],]开始,然后对列表中的每个元素添加1和2,得到[[1,1],[1,2],[

我想在以下元素上做一个循环:

[1,2,11,12,21,221111112121122,…,2222222]

比如说

[1,2,3,11,12,13,21,22,23,31,32,3311112113,…333]

我如何用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
nchips=总和(芯片)
traj=[]]
last=[]]
而len(最后[0])
当我用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();
    }
}
($i=-1;$i-1)的
{
$n5=基本单位换算($i,10,5);
$n5_str=strval($n5);
$tr=array();
$found=0;

对于($j=0;$j,如果您不关心生成顺序(我的意思是它将首先生成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);
}
publicstaticvoidgen(整数级){
如果(级别>0){
对于(int i=0;i对于(int i=1;i这看起来非常像用给定基数中的数字进行计数。(示例中的基数2和基数3)您可以使用integer.toString轻松地将整数转换为给定基数的字符串,并将该字符串的字符映射到符号。示例:

Integer.toString(6, 2) -> "011" 整数.toString(6,2)->“011” 将此字符串映射到字符数组,然后将该数组映射到符号。在您的示例中,这将是:“0”->1和“1”->2

这不是最有效的解决方案,但它可以让Integer.toString完成繁重的工作,让您执行简单的数组转换

要以另一种方式进行转换,可以将数组转换为字符串,然后使用Integer.parseInt再次提取int表示形式

如果您需要执行算术运算(我想主要是++和-,对于循环的上一个和下一个元素),请对整数执行算术运算,并根据需要来回转换

免责声明:我已经有一段时间没有用java编写代码了,因此方法和类名可能已关闭

编辑:如果您需要的符号超过32位和64位整数所能容纳的数量,则始终可以使用大整数

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


但这样做的缺点是过于复杂,不可能像最初设想的那样成为简单的解决方案。

我认为您的任务是一项组合任务,您应该实现组合算法,以找到给定数字(1,2,3,4)的唯一组合,并将该算法从1迭代到所需的长度

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

关于算法的讨论,我建议您阅读

公共课堂循环{
静态无效提前(StringBuilder sb,int B){
int pos=sb.length();
而(--pos!=-1&&sb.charAt(pos)='0'+B){
b.塞查拉特(位置“1”);
}
如果(位置==-1){
sb.插入(++pos,'0');
}
b.塞查拉特(pos,(char)(sb.charAt(pos)+1));
}
公共静态void main(字符串参数[]){
StringBuilder sb=新的StringBuilder();
对于(int i=0;i<20;i++){
(某人,3);
系统输出打印LN(sb);
}
}
}
推进工作如下:

  • 从右向左(
    --pos
  • 将所有
    B
    s滚动到
    1
    s
  • 直到你找到小于
    B
    的东西或者你撞到了墙上(
    pos==-1
  • 如果撞到墙,请插入
    0
  • pos

这不允许将'11'和'011'视为不同的结果,是吗?我认为这是我在PHP中所做的。但它并不像一开始看起来那么优雅。例如[1,2,3,10,11,12,13,…]将转换为[2,3,4,21,22,23,24,…]所以,我从来没有从1开始得到数字!Sfussengerger是对的;这种方法存在问题。它可以工作,但不像yngvedh所说的那么简单。你是对的。它不像我最初所想的那样工作。我将更新我的答案。如果你将循环条件写成
N-->0
,那么就不会那么混乱了f
N-->0
.N-->0可以被读取为“N归零”。可以说它实际上更容易读取,但它也有点破坏了表达式的真正含义。这一操作的简单程度取决于您需要对这些循环执行什么操作。您只是想将它们全部列举出来吗?
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);
        }
    }
}