java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

上下左右反転文字を出力

投稿日:

最終更新日:2016年08月17日

アイキャッチ

こんにちは。「Javaを復習する初心者」です。

twitter→ɹəʇʇɪʍʇというような変換をする文化があるそうです。今回はこのような反転処理を考えてみました。

参考にしたのは以下の記事です。

twitter→ɹəʇʇɪʍʇのように英数字を180度回転して表示する方法

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