#頭の体操
コンソールに任意の文字列を入力したときに
YamadaTaro //input
a r
m a
a T
d a
a d
T a
a m
r a
oraTadamaY
以上のように表示されるコードを書く。
最終行の**"oraTadamaY"**は、StringクラスかStringBuilderクラスに文字列を逆順に返すreverseメソッド的なのがあったような気がします(うろ覚え)。これが使えます。
さて、残り中間部分。文字の間に空白が(文字列長-2)個挿入されるということです。
ということは、(文字列長-2)回for文で結合を繰り返した空白文字列群の両端に、charAt()で抜き出した文字を連結させればいいのです。
main.java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
String a = s.nextLine();
StringBuilder sb = new StringBuilder(a);
StringBuilder blank = new StringBuilder();
int len = a.length();
for (int i = 0; i < len - 2; i++) {
blank.append(" ");
}
for (int j = 1; j < len - 1; j++) {
System.out.println(a.charAt(j) + blank.toString() + a.charAt(len - j - 1));
}
System.out.println(sb.reverse());
}
}
本当はScan したStinrgの方のまま扱いたかったのですが、reverseメソッドを使う必要があったためStringをStringBuilderに変換しています。
for(;;)は見通しがすこしよくないので、あまり使いたくありません。それよりも拡張forかwhileを使いたいのですが、無駄なローカル変数が増えそうだったのでfor(;;)使います。
今考えてみると、文字配列(char[])とif文でも行けそうな気がしますね。その場合、行数長くなりそうです。
System.out.println(a.charAt(j) + blank.toString() + a.charAt(len - j - 1));
}```
jの終値はlen-1なので、2-9行目の右端の文字のインデックスは{(len-1)-j}なのですね。上の**(len - j - 1))**よりも**len-1-j**のほうが分かりやすいのかなーと思います。