假设我有二十个变量,它们共同产生一个二十位数字。
我需要循环所有可能的组合,这就是我发现的方式:
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)
我想有更好的方法(反思?...)来制作它,所以我的问题是如何以更好的方式编写这段代码。
答案 0 :(得分:1)
我只想使用一个简单的整数计数器并将其打印在基数3中:
for (int i=0; i < Math.pow(3, 20); i++) {
System.out.println(Integer.toString(i, 20));
}
这实际上足以代表您的20个变量对象并生成其所有状态,但是我们需要进行大量转换才能满足您的要求:
0
,1
和2
符号,我们必须将它们转移到1
,2
和{{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