Java - 一次替换多个字符串

4

我正在尝试编写一个程序,它可以将一个字符串(str)转换为北约音标字母表(newSentence)。

这是我尝试过的代码:

newSentence = str.toLowerCase().replace("a", "Alpha ")
                               .replace("b", "Bravo ")
                               .replace("c", "Charlie ")
                               .replace("d", "Delta ")
                               .replace("e", "Echo ")
                               .replace("f", "Foxtrot ")
                               .replace("g", "Golf ")
                               .replace("h", "Hotel ")
                               .replace("i", "India ")
                               .replace("j", "Juliet ")
                               .replace("k", "Kilo ")
                               .replace("l", "Lima ")
                               .replace("m", "Mike ")
                               .replace("n", "November ")
                               .replace("o", "Oscar ")
                               .replace("p", "Papa ")
                               .replace("q", "Quebec ")
                               .replace("r", "Romeo ")
                               .replace("s", "Sierra ")
                               .replace("t", "Tango ")
                               .replace("u", "Uniform ")
                               .replace("v", "Victor ")
                               .replace("w", "Whiskey ")
                               .replace("x", "X-Ray ")
                               .replace("y", "Yankee ")
                               .replace("z", "Zulu ");

然而,这显然行不通,因为在它替换每个 "a" 为 "Alpha" 后,它将取出每个 "l"、"p" 和 "h" 并重新转换它们,以此类推。有没有一种方法可以一次性转换所有字母,使其更加高效?


1
也许你可以遍历每个字符并基于输入字符串构建一个全新的字符串,而不是多次调用 replace - Sam I am says Reinstate Monica
https://dev59.com/MGsz5IYBdhLWcg3wy7A9 - Jens Piegsa
3个回答

2

迭代地创建新字符串:

StringBuilder outSB = new StringBuilder();
for(int i=0; i < str.length(); i++){
    if(str.charAt(i) == 'a' || str.charAt(i) == 'A') outSB.append("Alpha ");
    if(str.charAt(i) == 'b' || str.charAt(i) == 'B') outSB.append("Bravo ");
    // and so on
}
String output = outSB.toString();

你不应该把“i”传递给“charAt”吗? - Sam I am says Reinstate Monica
@SamIam 我的疏忽,已修复。 - nanofarad
太棒了,谢谢,完美地运行了。我唯一改变的是将第一个以外的每个 if 改成了 else if,并在最后添加了 else outSB.append(str.charAt(i) + " "); 以处理非字母字符。 - Dale22599

1
private static Map<Character, String> lookup = new HashMap<>();
public static void main(String[] args) {
    String input = "abc";
    StringBuilder sb = new StringBuilder();

    for(char c : input.toCharArray()){
        sb.append(lookup.get(c));
        sb.append(" ");
    }

    System.out.println(sb.toString());

}

static {
    lookup.put('a', "Alpha");
    lookup.put('b', "Bravo");
    lookup.put('c', "Charlie");
}

输出:

阿尔法布拉沃查理

创建一个查找表并根据原始字符串中的每个字符构建新字符串。


0
StringBuilder sb = new StringBuilder();
for (char c : str.toLowerCase().toCharArray()) {
    switch (c) {
        case 'a':  
            sb.append("Alpha ");
            break;
        case 'b':  
            sb.append("Bravo ");
            break;
        // and so on until Zulu...
        default:
            // optional: just pass through any character not in NATO alphabet
            sb.append(c);
            break;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接