3

メソッドの目的は、次のような文字列の音訳です: афиваў => afivaw. 問題はcharAt、'ш' => "sh" という 2 つの記号として音訳する必要がある文字があるため、メソッドを使用して再定義できないことです。私はこれを試します:

public static String belrusToEngTranlit (String text){
    char[] abcCyr = {'a','б','в','г','д','ё','ж','з','и','к','л','м','н','п','р','с','т','у','ў','ф','х','ц','ш','щ','ы','э','ю','я'};
    String[] abcLat = {"a","b","v","g","d","jo","zh","z","i","k","l","m","n","p","r","s","t","u","w","f","h","ts","sh","sch","","e","ju","ja"};
    for (int i = 0; i < text.length(); i++) {
        for(int x = 0; x < abcCyr.length; x++ )
        if (text.charAt(i) == abcCyr[x]) {
            text.charAt(i) = abcLat[x];
        }
    }
    return text;
}

以外の何かを私に勧めることができますcharAtか?

4

3 に答える 3

5

文字列は不変であるため、その中のテキストを変更することはできません。StringBuilderしたがって、結果を保存するために使用できます。以下のコードを参照してください。

public static String belrusToEngTranlit (String text){
    char[] abcCyr = {'a','б','в','г','д','ё','ж','з','и','к','л','м','н','п','р','с','т','у','ў','ф','х','ц','ш','щ','ы','э','ю','я'};
    String[] abcLat = {"a","b","v","g","d","jo","zh","z","i","k","l","m","n","p","r","s","t","u","w","f","h","ts","sh","sch","","e","ju","ja"};

    StringBuilder builder = new StringBuilder();

    for (int i = 0; i < text.length(); i++) {
        for(int x = 0; x < abcCyr.length; x++ )
        if (text.charAt(i) == abcCyr[x]) {
            builder.append(abcLat[x]);
        }
    }
    return builder.toString();
}
于 2014-02-02T11:09:57.997 に答える
2

Stringは不変です。次のような文字を設定することはできません:
text.charAt(i) = abcLat[x]
この行も構文的に正しくありません
(不変性は言うまでもありません)。

を見てくださいStringBuilder
これは私がお勧めできるものです。

キリル文字からラテン文字への変換は簡単ですが、その逆
(必要な場合) は少し難しくなります。なんで?
たとえば、「s」だけをチェックすることはできない
ため、次の文字も調べて
「h」かどうかを確認する必要があります。

于 2014-02-02T11:04:19.983 に答える
2

文字列は不変です (内容を変更することはできません) が、StringBuilder変更可能な文字列の一種である a を使用するように少し変更すると、コードが機能します。

public static String belrusToEngTranlit (String text){
    char[] abcCyr = {'a','б','в','г','д','ё','ж','з','и','к','л','м','н','п','р','с','т','у','ў','ф','х','ц','ш','щ','ы','э','ю','я'};
    String[] abcLat = {"a","b","v","g","d","jo","zh","z","i","k","l","m","n","p","r","s","t","u","w","f","h","ts","sh","sch","","e","ju","ja"};
    StringBuilder english = new StringBuilder();
    outer:
    for (int i = 0; i < text.length(); i++) {
        for(int x = 0; x < abcCyr.length; x++ )
            if (text.charAt(i) == abcCyr[x]) {
                english.append(abcLat[x]);
                continue outer; // jump to next letter
            }
        // if no replacement made, use character as-is
        english.append(text.charAt(i));
    }
    return english.toString();
}

replaceEach()Apache の commons-lang ライブラリには、まさにこれを行う utility メソッドがあることに注意してください。車輪を再発明するのではなく、単にこれを行うことができます:

public static String belrusToEngTranlit (String text){
    String[] abcCyr = {"a","б","в","г","д","ё","ж","з","и","к","л","м","н","п","р","с","т","у","ў","ф","х","ц","ш","щ","ы","э","ю","я"};
    String[] abcLat = {"a","b","v","g","d","jo","zh","z","i","k","l","m","n","p","r","s","t","u","w","f","h","ts","sh","sch","","e","ju","ja"};
    return StringUtils.replaceEach(text, abcCyr, abcLat);
}
于 2014-02-02T11:09:26.883 に答える