35455


javaのStringBufferでする処理について質問があります。  
最終的な表示の仕方としては、

１「ネ」２「ウシ」３「トラ」４「ウ‌​」５「タツ」６「ミ」７「ウマ」８「ヒツジ‌​」９「サル」
１０「トリ」１１「イヌ」１２「イ」１３「ネ」１４「ウシ」１５「トラ」１６「ウ」１７「タツ」１８「ミ」１９「ウマ」２０「ヒ‌​ツジ」２１「サル」
２２「トリ」２３「イヌ」２４「イ」

と連続した表示をさせたいと思っています。  
上記のように干支を２回繰り返し表示させるとすると、appendとfor文だ‌​けでは難しいでしょうか。switch文を使うと‌​できたのですが、使わずに簡易的にできない‌​かと思いましてお聞きしてみました。

どなたかもう少し簡易的に表示させる方法が  
お分かりの方がいらっしゃいましたら  
教えていただきたいです。宜しくお願いします。

[code]

    public static void main(String[] args) {
    String[] eto = {"ネ", "ウシ", "トラ", "ウ", "タツ", "ミ", "ウマ", "ヒツジ", "サル", "トリ", "イヌ", "イ"};
    
    StringBuffer strbufr = new StringBuffer();
    
    for (int z = 1; z <= 24; z++) {
        strbufr.append(z);
        strbufr.append("(");
            switch(i % 12) {
            case 0:
                strbufr.append(eto[0]);
                break;
            case 1:
                strbufr.append(eto[1]);
                break;
            case 2:
                strbufr.append(eto[2]);
                break;
            　
                ・
                ・
             （中略）
    
            case 23:
                strbufr.append(eto[23]);
                break;
            }
            strbufr.append(")");
    
       }
    
    System.out.println(strbufr);
    
    }
    
[/code]

註：この質問は[「繰り返し処理で配列のインデックスと要素を連結したい」](https://ja.stackoverflow.com/q/35442/19110)の続きです。


CC BY-SA 3.0
2017-06-10T03:24:59.413
35450
2017-06-10T19:24:42.713
2017-06-10T04:09:44.773
19110
13251
question
java
繰り返し処理で配列と数値の連結表示について


単純な2重ループにすることで解決できます。

こういったプログラムを組む場合、数字の法則性をいかに見つけるかが鍵になります。  
今回の場合だと、たとえば干支の周期ごとにそれぞれの干支の数字を見ていくと、

  * 1周期目: 自身のインデックス番号(1~12) 
    * 子 = 1, 丑 = 2, ...
  * 2周期目: 自身のインデックス番号(1~12) + 12 
    * 子 = 13, 丑 = 14, ...
  * 3周期目: 自身のインデックス番号(1~12) + 24 
    * 子 = 25, 丑 = 26, ...
  * ...

という風に表すことが出来ます。  
つまり、n周期目には 「自身のインデックス番号 * (n - 1)」 の数字が当てはまることになります。  
各周期ごとに、各干支の文字を出力する、というプログラムは、以下のようになりますね。

[code]

    String[] eto = {/* 干支の文字が入っている */};
    for (int i = 1; i <= 2; i++) {
      for (int j = 1; j <= 12; j++) {
        int number = (i * 12 + (j - 1));
        System.out.println(eto[j] + " " + number);
      }
    }
    
[/code]

あとは自分で考えてみてください。


CC BY-SA 3.0
2017-06-10T03:49:57.017
35454
2017-06-10T03:49:57.017
7655
35450
answer


**switch** の`i % 12`と **case** の数字と`eto[ ]`のインデックスは同じですから、  
単に`strbufr.append(eto[(z-1)%12]);` でいいです。( `i` は`z-1` のタイポだと思われます)  
コード例：

[code]

    //省略
    int eto_len = eto.length;//基準となる12のような数値はそのままちりばめないで例えば変数として名前を付ける。
    for (int z = 1; z <= eto_len*2; z++) {
        strbufr.append(z);
        strbufr.append("(");
        strbufr.append(eto[(z-1) % eto_len]);
        strbufr.append(")");
    }
    //省略
    
[/code]

  
  

* * *

おまけ  
`for (int z = 1; z <= 24; z++) { ... }`  
というようなループにすると、１から２４の数字に合わせて配列の内容を表示するというような印象を受けます。

「干支を２回繰り返し表示させる」ということが目的の場合  
`for (int times = 0; times < 2; ++times) { /* 繰り返したい処理:干支の内容を表示する */ }`  
の方が（細部はこの時点でわからなくても２回処理をするという）意図がはっきりします。  
そして、内部の処理ですが、  
今回の場合、付け加える数字は干支のインデックスではなく、一連番号ですから、  
要素を数えて個別の番号にする方がしっくりきます。  
例えば、次のようにします。

[code]

    for(String eto_name : eto){//配列の内容が順にアクセスできれば良いのでインデックスは特に必要としない。
        strbufr.append(++no);//０から始めて各要素を処理する時に数える。これが一連番号になる。
        strbufr.append("(");
        strbufr.append(eto_name);
        strbufr.append(")");
    }
    
[/code]

全体（前後の処理は省略）：

[code]

    for (int times = 0, no = 0; times < 2; ++times) {//noはループの外では使わないのでここに書いた
        for(String eto_name : eto){
            strbufr.append(++no);
            strbufr.append("(");
            strbufr.append(eto_name);
            strbufr.append(")");
        }
    }
    
[/code]

* * *

外側ループをwhileで書いてみる。  
次の例のようにに書き直す理由：  
forループの場合ループ制御変数である`times`はループの中で使われていない。  
（なのでおそらく必要無い）  
ループの回数は直接数値を埋め込むのではなく変数にしたい。

[code]

    int no = 0;//一連番号
    int n = 2; //繰り返し回数
    while (n-- != 0) {
        for(String eto_name : eto){
            strbufr.append(++no);
            strbufr.append("(" + eto_name + ")");//メソッド呼び出し回数を減らすとともにコードが減る。カッコで囲むというのがよりはっきりする。
        }
    }
    //no は要素を処理した回数    
    
[/code]

補足  
`no`を０から始める理由（必ずしも０から始めた方が良いと言っているのではないことに注意）：  
何らかの理由で内側のループの本体が一度も実行されなかった場合、  
（この場合全体の）ループの後、  
`no`が０であるかどうかを調べることでループが実行されなかったことがわかりやすい。  
（要素を数えたから０から１になった（そして２になり３になる...））  
（逆に`no`を１から始めた場合、そのことがあいまいに思える。(どこでカウントアップしたかで`no`が処理数(`no-1`)なのか最後の表示番号なのかどうかが変わる)番号の他になんらかの検証（フラグを追加？）が必要？）


CC BY-SA 3.0
2017-06-10T04:10:12.847
35455
2017-06-10T19:24:42.713
2017-06-10T19:24:42.713
5044
5044
35450
answer