gpt4 book ai didi

Java:简洁的 FOR 循环

转载 作者:行者123 更新时间:2023-12-01 10:00:14 26 4
gpt4 key购买 nike

假设我有二十个变量,它们加在一起会产生一个二十位数字。

  • 每个变量包含 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)

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

最佳答案

我只使用一个简单的整数计数器并以 3 为基数打印它:

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

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

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

这给了我们最终的代码:

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"));
}

编辑:当我可以使用流和 lambda 时,为什么我必须编写丑陋的代码?

IntStream.range(0, (int)Math.pow(3, 20))                       // yields 0 to 3^20-1
.mapToObj(number -> Integer.toString(number, 3)) // base 3 conversion
.map(string -> String.format("%1$20s", string)) // 20 char padding
.map(paddedString -> paddedString.replace("2", "3")) // number shifting. must be made in this specific order not to fail
.map(paddedString -> paddedString.replace("1", "2"))
.map(paddedString -> paddedString.replace("0", "1"))
.map(paddedString -> paddedString.replace(" ", "1"))
.forEach(System.out::println);

关于Java:简洁的 FOR 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36867249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com