Java:succint FOR循环

时间:2016-04-26 14:02:33

标签: java

假设我有二十个变量,它们共同产生一个二十位数字。

  • 每个变量包含1到3个。
  • 示例:11132211332212331233

我需要循环所有可能的组合,这就是我发现的方式:

StringBuffer myStr = new StringBuffer();

for(byte i1=1; i<21; i++)

  for(byte i2=1; i2<21; i2++)

    for(byte i3=1; i3<21; i3++)      // and so on till i20
      ...
      myStr.append (i+i1+i2...i20)

我想有更好的方法(反思?...)来制作它,所以我的问题是如何以更好的方式编写这段代码。

2 个答案:

答案 0 :(得分:1)

我只想使用一个简单的整数计数器并将其打印在基数3中:

for (int i=0; i < Math.pow(3, 20); i++) {
    System.out.println(Integer.toString(i, 20));
}

这实际上足以代表您的20个变量对象并生成其所有状态,但是我们需要进行大量转换才能满足您的要求:

  • 该数字自然会使用012符号,我们必须将它们转移到12和{{1} }
  • 这个数字自然不会被填充。我们使用3格式描述符,这意味着“位置参数1,作为20个字符串(默认情况下填充为左侧)”。但是,这会填充空格,因此我们还必须用%1$20s替换空格。

这给了我们最后的代码:

1

编辑:为什么我可以在使用stream和lambdas时编写丑陋的代码?

for (int i=0; i < Math.pow(3, 20); i++) {
    System.out.println(String.format("%1$20s", Integer.toString(i, 20)).replace("2", "3").replace("1", "2").replace("0", "1").replace(" ", "1"));
}

答案 1 :(得分:0)

for(long count = 0; count <= 3486784400L; count++) {
    String val = "11111111111111111111" + Long.toString(count, 3).replaceAll("2", "3").replaceAll("1", "2").replaceAll("0", "1");
    System.out.println(val.substring(val.length() - 20));
}

输出:

11111111111111111111
11111111111111111112
11111111111111111113
11111111111111111121
11111111111111111122
11111111111111111123
11111111111111111131
...etc