在同一循环中进行递增和递减的高效方法

9
假设存在某些情况,您想在同一 for 循环中增加和减少值。 在这组情况下,有些情况下,您可以通过利用情况的性质来“欺骗”它-例如,反转字符串。
由于构建字符串的特性,我们实际上不必操纵迭代或添加额外的计数器:
public static void stringReversal(){
    String str = "Banana";
    String forwardStr = new String();
    String backwardStr = new String();

    for(int i = str.length()-1; i >= 0; i--){
        forwardStr = str.charAt(i)+forwardStr;
        backwardStr = backwardStr+str.charAt(i);
    }

    System.out.println("Forward String:  "+forwardStr);
    System.out.println("Backward String: "+backwardStr);   
}

然而,假设存在一种情况,我们只想打印一个递减的值,从初始值到0,以及一个递增的值,从0到初始值。
public static void incrementAndDecrement(){

   int counter = 0;

   for(int i = 10; i >= 0; i--){
       System.out.println(i);
       System.out.println(counter);
       counter++;
   } 
}

这个方法已经可以很好地工作了,但是需要创建第二个计数器来增加似乎有些凌乱。是否有任何数学技巧或与for循环相关的技巧可以使用,使得counter变得多余?


1
简单算术有什么问题吗? 10 - i - Alexis King
1
@JakeKing 我相信这是睡眠不足造成的。 - Anthony Neace
2个回答

14

看起来你只是想要:

for(int i = 10; i >= 0; i--){
    System.out.println(i);
    System.out.println(10 - i);
} 

是这样吗?个人而言,我通常会将其写成递增循环,因为我觉得这样更容易理解:

for (int i = 0; i <= 10; i++) {
    System.out.println(10 - i);
    System.out.println(i);
} 

请注意,顺便说一下,您的字符串示例非常低效 - 远远不如引入一个额外的变量。考虑到你已经知道了涉及的长度,你可以直接使用正确大小的两个char []数组,并每次填充正确的索引。然后再创建每个字符串。同样,我会用一个递增的循环来完成这个操作:

char[] forwardChars = new char[str.length()];
char[] reverseChars = new char[str.length()];
for (int i = 0; i < str.length(); i++) {
    forwardChars[i] = str.charAt(i);
    reverseChars[reverseChars.length - i - 1] = str.charAt(i);
}
String forwardString = new String(forwardChars);
String reverseString = new String(reverseChars);

当然,在这种情况下,forwardString只是等于str而已...


1
现在开始点赞了!!;-) - Arham
1
我实际上希望这能引发关于这类问题效率的讨论,但我不确定如何将其融入问题中。感谢您采取额外措施详细说明两个示例! - Anthony Neace

7
你可以在 for 循环中使用多个变量和增量器。
for(int i = 10, j = 0; i >= 0; i--, j++) {
    System.out.println(i);
    System.out.println(j);
} 

那与添加计数器变量有何不同?问题在于减少变量数量。 - Arham
1
不是这样的。他只是要求它少一些“混乱”,并涉及for循环,所以我想这可能是他正在寻找的。 :) - gnunaes
1
+1 对于这个主题增加了我的知识。它确实不那么“混乱”,因为它将所有内容都保留在循环中,因此符合我的问题范围。 - Anthony Neace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接