8

同じ 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++;
   } 
}

これは十分に機能しますが、インクリメントするために 2 つ目のカウンターを作成する必要があるのは面倒です。counter冗長になる for ループを使用できる数学的なトリックやトリックはありますか?

4

2 に答える 2

13

それはあなたがただ欲しいように見えます:

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[]は、適切なサイズの 2 つから開始し、毎回適切なインデックスを設定できます。その後、それぞれから文字列を作成します。繰り返しますが、増加するループでこれを行います。

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です...)

于 2012-10-17T06:03:35.723 に答える
6

forループ内に複数の変数とインクリメンターを含めることができます。

for(int i = 10, j = 0; i >= 0; i--, j++) {
    System.out.println(i);
    System.out.println(j);
} 
于 2012-10-17T06:07:28.203 に答える