【问题标题】:Java - Replacing many strings at onceJava - 一次替换多个字符串
【发布时间】:2013-12-05 05:40:32
【问题描述】:

所以我正在尝试编写一个程序,该程序接受一个字符串 (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”并重新转换它们等等。有没有办法一次转换所有的字母,这样就不会发生这种情况,并提高效率?

【问题讨论】:

标签: java string replace


【解决方案1】:

迭代创建一个新字符串:

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 吗?
  • @SamIam 我的疏忽,已修复。
  • 太棒了,谢谢,完美运行。我唯一改变的是,除了第一个之外,我将每个if 都转为else if,最后我添加了else outSB.append(str.charAt(i) + " ");,如果它不是一封信的话。
【解决方案2】:
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;
    }
}

【讨论】:

    【解决方案3】:
    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");
    }
    

    输出:

    阿尔法布拉沃查理

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

    【讨论】:

      猜你喜欢
      • 2011-07-01
      • 2011-12-01
      • 1970-01-01
      • 2017-10-23
      • 2016-12-03
      • 1970-01-01
      • 2020-01-16
      相关资源
      最近更新 更多