上下左右反転文字を出力
こんにちは。「Javaを復習する初心者」です。twitter→ɹəʇʇɪʍʇというような変換をする文化があるそうです。今回はこのような反転処理を考えてみました。
参考にしたのは以下の記事です。
StringBuilderを使う
プログラミングとしては一文字のUnicodeから上下反転に対応するUnicodeに変換しようと考えました。では順序を逆にするにはどうするかというと、StringBuilderクラスにreverse()というメソッドがありますので、これを使いました。
StringBuilderクラス#reverse()で、例えば「Hello」という文字列を逆順にすることが可能です。以下のように使います。
System.out.println(new StringBuilder("Hello").reverse());
上記の結果は「olleH」になります。それにして何故このようなメソッドが用意されているのか、一般的な使い方は想像できませんでした。
この左右反転のStringBuilderオブジェクトをString型に変換すれば、あとは先頭からString#charAt()メソッドでUnicodeを変換していくだけです。このメソッドはcharを返却するので、switch文のkeyにできます。case文のkey例えば’a’というように記述できます。
プログラム
今回は以前使用した著作権フリーの英文の一部「About a mile from the town towards the ocean is the lighthouse」を上下左右反転しようと思います。以下はソースと実行結果です。
package practice; public class Hello20160817 { public static void main(String[] args) { StringBuilder sb = new StringBuilder("About a mile from the town towards the ocean is the lighthouse"); sb = sb.reverse(); String s = sb.toString(); for (int i = 0; i < s.length(); i++) { System.out.print(change(s.charAt(i))); } } private static char change(char key) { char c; switch (key) { case 'A': c = 0x2200; break; case 'B': c = 0x15FA; break; case 'C': c = 0x2183; break; case 'D': c = 0x15E1; break; case 'E': c = 0x2203; break; case 'F': c = 0x2132; break; case 'G': c = 0x2141; break; case 'H': c = 0x0048; break; case 'I': c = 0x0049; break; case 'J': c = 0x027E; break; case 'K': c = 0x4E2C; break; case 'L': c = 0x2142; break; case 'M': c = 0x0057; break; case 'N': c = 0x004E; break; case 'O': c = 0x004F; break; case 'P': c = 0x0064; break; case 'Q': c = 0x038C; break; case 'R': c = 0x1D1A; break; case 'S': c = 0x0053; break; case 'T': c = 0x22A5; break; case 'U': c = 0x2229; break; case 'V': c = 0x039B; break; case 'W': c = 0x004D; break; case 'X': c = 0x0058; break; case 'Y': c = 0x2144; break; case 'Z': c = 0x005A; break; case 'a': c = 0x0250; break; case 'b': c = 0x0071; break; case 'c': c = 0x0254; break; case 'd': c = 0x0070; break; case 'e': c = 0x0259; break; case 'f': c = 0x025F; break; case 'g': c = 0x0253; break; case 'h': c = 0x0265; break; case 'i': c = 0x026A; break; case 'j': c = 0x027E; break; case 'k': c = 0x029E; break; case 'l': c = 0x006C; break; case 'm': c = 0x026F; break; case 'n': c = 0x0075; break; case 'o': c = 0x006F; break; case 'p': c = 0x0064; break; case 'q': c = 0x0062; break; case 'r': c = 0x0279; break; case 's': c = 0x0073; break; case 't': c = 0x0287; break; case 'u': c = 0x006E; break; case 'v': c = 0x028C; break; case 'w': c = 0x028D; break; case 'x': c = 0x0078; break; case 'y': c = 0x028E; break; case 'z': c = 0x007A; break; case '0': c = 0x0030; break; case '1': c = 0x0031; break; case '2': c = 0x0032; break; case '3': c = 0x03B5; break; case '4': c = 0x071B; break; case '5': c = 0x0035; break; case '6': c = 0x0039; break; case '7': c = 0x004C; break; case '8': c = 0x0038; break; case '9': c = 0x0036; break; case '.': c = 0x02D9; break; case ',': c = 0x2018; break; case '–': c = 0x002D; break; case ':': c = 0x003A; break; case ';': c = 0x061B; break; case '!': c = 0x00A1; break; case '?': c = 0x00BF; break; case '&': c = 0x214B; break; default : c = key ; break; } return c; } }
əsnoɥʇɥɓɪl əɥʇ sɪ uɐəɔo əɥʇ spɹɐʍoʇ uʍoʇ əɥʇ ɯoɹɟ əlɪɯ ɐ ʇnoq∀
ブラウザ上で表示できているのか不安ですが、文字の左右の順序が入れ替わり、見た目は上下反転してます。
さて、上記のプログラムでswitch文の内容がたくさんあるのですが、これを一行ずつ入力していったわけはありません。今回はOpenOffice 4.1.2の表計算ソフトを使用しました。まず、冒頭に挙げた参考サイトから表をコピーします。これをテキストエディタに貼り付けるとタブ区切りになります。これをコピーして表計算ソフトに貼り付けます。そのあとは列の切り貼りを適宜応用し、一行が以下のような状態にします。サイト上ではU+と記載されている個所は0xにします。16進数の数値を表すための表記です。
case | ‘ | A | ‘ | : c = | 0x2200 | ; break; |
これをEclipseに貼り付ければタブ区切りで貼り付けられます。後はタブを空白に変換するなど微調整をして完成です。case文からbreak文まで改行なしですが、見やすいのでこの状態にしました。右クリックメニューからフォーマットをかけることも可能です。