こんにちは。「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文まで改行なしですが、見やすいのでこの状態にしました。右クリックメニューからフォーマットをかけることも可能です。