mapでひらがなをローマ字に

マップとは

英単語から訳語を探すように、あるデータ(これをキーと言います)から対応するデータ(これを値と言います)を求めるような構造をマップといいます。

キー
red
blue
yellow

javaでのマップの使い方

まずマップを宣言します

HashMap<String, String> マップの名前 = new HashMap<String, String>();

マップへのデータの格納は以下のように行います。

マップの名前.put( キー, 値 );

マップの名前とキーと値を指定してデータを格納しす。

例えば、マップmapにデータを格納するには、以下のように書きます。

HashMap<String, String> map = new HashMap<String, String>();
map.put( "red", "赤" );
map.put( "blue", "青" );
map.put( "yellow", "黄" );

マップmapからキーに相当する値を取り出すには、以下のように書きます。

String key,value;
key = "blue";
value = map.get( key );
System.out.println( key + ": " + value );

実行結果は

blue: 青

促音(っ)・拗音(ゃゅょ)を考慮しない

まず、促音・拗音のない文字列ならうまく変換できるというものをつくります。

プログラム名 Hira2Roma01.java

import java.util.*;
import java.io.*;

public class Hira2Roma01{
    public static void main(String[] args) {
        ArrayList<String> hiralines = new ArrayList<String>();
        HashMap<String, String> hira2romamap = new HashMap<String, String>();
        hira2romamap = setHira2RomaMap();
        hiralines = kanayoui("hiragana.txt");
        for ( String hira : hiralines ){
            String roma = trans(hira,hira2romamap);
            System.out.println(hira);
            System.out.println(roma);
        }
    }
    public static String trans(String line,HashMap<String, String> map){
        String result = "";
        String h1,r1;
        for (int i=0; line.length()>i; i++){
            h1 = line.substring(i,i+1);
            r1 = map.get(h1);
            if (r1==null) {result += h1;continue;}
            result += r1;
        }
        return result;
    }
    
    public static ArrayList<String> kanayoui(String f){
        ArrayList<String> doc = new ArrayList<String>();
        try {
            FileReader   in  = new FileReader(f);
            BufferedReader inb = new BufferedReader(in);
            String line;
            while ((line = inb.readLine()) != null) {
                doc.add(line);
            }
            inb.close();
            in.close();
        }
        catch (IOException e) {
            System.err.println( f + " がないのでは?" );
            System.err.println( e);
        }
        return doc;
    }
        
    public static HashMap<String, String> setHira2RomaMap(){
        HashMap<String, String> map = new HashMap<String, String>();
        map.put( " ", " " );
        map.put( "ぁ", "^a" );
        map.put( "あ", "a" );
        map.put( "ぃ", "^yi" );
        map.put( "い", "i" );
        map.put( "ぅ", "^u" );
        map.put( "う", "u" );
        map.put( "ぇ", "^ye" );
        map.put( "え", "e" );
        map.put( "ぉ", "^o" );
        map.put( "お", "o" );
        map.put( "か", "ka" );
        map.put( "が", "ga" );
        map.put( "き", "ki" );
        map.put( "ぎ", "gi" );
        map.put( "く", "ku" );
        map.put( "ぐ", "gu" );
        map.put( "け", "ke" );
        map.put( "げ", "ge" );
        map.put( "こ", "ko" );
        map.put( "ご", "go" );
        map.put( "さ", "sa" );
        map.put( "ざ", "za" );
        map.put( "し", "shi" );
        map.put( "じ", "ji" );
        map.put( "す", "su" );
        map.put( "ず", "zu" );
        map.put( "せ", "se" );
        map.put( "ぜ", "ze" );
        map.put( "そ", "so" );
        map.put( "ぞ", "zo" );
        map.put( "た", "ta" );
        map.put( "だ", "da" );
        map.put( "ち", "chi" );
        map.put( "ぢ", "ji" );
        map.put( "っ", "_" );
        map.put( "つ", "tsu" );
        map.put( "づ", "zu" );
        map.put( "て", "te" );
        map.put( "で", "de" );
        map.put( "と", "to" );
        map.put( "ど", "do" );
        map.put( "な", "na" );
        map.put( "に", "ni" );
        map.put( "ぬ", "nu" );
        map.put( "ね", "ne" );
        map.put( "の", "no" );
        map.put( "は", "ha" );
        map.put( "ば", "ba" );
        map.put( "ひ", "hi" );
        map.put( "び", "bi" );
        map.put( "ふ", "fu" );
        map.put( "ぶ", "bu" );
        map.put( "へ", "he" );
        map.put( "べ", "be" );
        map.put( "ほ", "ho" );
        map.put( "ぼ", "bo" );
        map.put( "ま", "ma" );
        map.put( "み", "mi" );
        map.put( "む", "mu" );
        map.put( "め", "me" );
        map.put( "も", "mo" );
        map.put( "ゃ", "^ya" );
        map.put( "や", "ya" );
        map.put( "ゅ", "^yu" );
        map.put( "ゆ", "yu" );
        map.put( "ょ", "^yo" );
        map.put( "よ", "yo" );
        map.put( "ら", "ra" );
        map.put( "り", "ri" );
        map.put( "る", "ru" );
        map.put( "れ", "re" );
        map.put( "ろ", "ro" );
        map.put( "ゎ", "^wa" );
        map.put( "わ", "wa" );
        map.put( "ゐ", "i" );
        map.put( "ゑ", "e" );
        map.put( "を", "wo" );
        map.put( "ん", "n" );
        map.put( "ゔ", "vu" );
        return map;
    }
}

変換する文字列は、ファイルに保管しておきます。

ファイル名 hiragana.txt

かとう はなこ
いとう ひろぶみ
いたがき たいすけ

内容は自由に追加して構いません。

わざと、「っゃゅょ」を含むものを入れて、"_"や"^"がつくことを確認してください。 "_"や"^"は、促音・拗音に対応するために、mapに入れてあるものです。

マップにない文字は、変換されずにそのまま表示されます。

if (r1==null) {result += h1;continue;}

がその役目をしています。

促音(っ)を考慮する

促音のローマ字化の約束は、

かっこ
kakko
とっさ
tossa

というように「っ」はなくなって、次の文字の最初が繰り返される。

プログラムでは、とりあえず「っ」は特殊な文字、「_」にしています。

map.put( "っ", "_" );

「_」にしているのは、result += r1;をするときに、resultの最後が"_"だったらこれを取り、r1の最初の文字を繰り返せば、促音(っ)を考慮するプログラムにできると考えているからです。

拗音(ゃゅょ)を考慮する

拗音のローマ字化の約束は、規則性のあるものでは

きゃらめる
kyarameru
きょう
kyou
ひゅうが
hyuuga
にゅうどうぐも
nyuudougumo

01のプログラムでは、とりあえず次のようになります。

きゃらめる
ki^yarameru
きょう
ki^you
ひゅうが
hi^yuuga
にゅうどうぐも
niyuudougumo

ちょっと面倒なものでは

しゅみ
shumi
しょう
shou
ちゅうしょく
chushoku

01のプログラムでは、とりあえず次のようになります。

しゅみ
shi^yumi
しょう
shi^you
ちゅうしょく
chu^yushi^yoku

課題

1

Hira2Roma01.javaをつくりなさい。ただし「ぱぴぷぺぽ」をmapに入れるのを忘れています。加えて、ぱぴぷぺぽが pa pi pu pe po に変換されるようにしなさい。

2

拗音(ゃゅょ)はどうすればよいか。

youon.txtに書いてjavaフォルダ内に提出