3

方法的目的是字符串的音译,例如:афиваў => afivaw。问题是:我不能使用charAt方法重新定义,因为有些字母需要音译为两个符号'ш'=>“sh”。我试试这个:

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

字符串是不可变的(您不能更改它们的内容),但只需稍作更改即可使用 a 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 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 库中的实用程序方法正是这样做的。您可以简单地这样做,而不是重新发明轮子:

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 回答
2

String是不可变的,你不能像这样设置字符:
text.charAt(i) = abcLat[x]
这行在语法上也是不正确
的(更不用说不可变了)。

StringBuilder
这是我可以推荐的。

西里尔文到拉丁文更容易,相反
(如果你需要的话)会更难一些。为什么?
因为例如你不能只检查's',你还
需要检查下一个字符以查看
它是否是'h'。

于 2014-02-02T11:04:19.983 回答