switch 的替代方案——替换字符

Alternative to switch -- replacing characters

我被要求为 class 编写一个程序,其中:

  1. 接受了 .txt 文件
  2. 将文件中的数字 0-9 转换为对应的文本(如果数字在句首,则使用大写)
  3. 将完成的句子打印到新文件

示例:

The 8 eggs were separated into 3 groups.

将转换为:

The eight eggs were separated into three groups.

目前我正在使用带有 StringBuilder 的(非常)长的 switch 语句来完成任务:

switch(sb.charAt(i)){
        case '0':
            if (i == 0)
                sb.replace(i, i+1, "Zero");
            else
                sb.replace(i, i+1, "zero");
            break;
        case '1':
            if (i == 0)
                sb.replace(i, i+1, "One");
            else
                sb.replace(i, i+1, "one");
            break;
        ..... 
}

还有更advanced/efficient的方法来完成这个任务吗?

你可以这样做。

Sting[] token = statement.split(" ");
String newStatement = "";
for(int x=0; x<token.length; x++){
    if(token[x].matches("[0-9]+"))
        newStatement  += convertToText(token[x]) + " ";
    else
        newStatement  += token[x] + " ";        
}

public static String converetToText(String str){
    String[] text = {"zero", "one", "two", "three", "four", "five", "six", "seven". "eight", "nine"};
    return text[Integer.parseInt(str)];
}

您的整个程序已完成。


解释:

  1. 用空格分割给定的语句。
  2. 将单个单词存储到字符串数组 (token[])
  3. 检查每个单词是否是数字
  4. 如果它是一个数字转换为文本并将其添加到新语句中。
  5. 如果是文本,请直接将其添加到您的新声明中。

您可能正在寻找 HashMap。这可以帮助:

  1. 创建静态 HashMap<String, String> DIGITS 并使用 put("0", "zero"); put("1", "one"); //etc.. 对其进行初始化。
  2. 使用 string.split(" ") 拆分您的输入字符串;这将创建一个字符串数组,如下所示:{"The","8","eggs",...}.
  3. 使用StringBuilder构建答案:

    for (String s : splitted) {
        if (DIGITS.contains(s))
            sb.append(DIGITS.get(s));
        else
            sb.append(s);
        sb.append(' ');
    }
    

我会做这样的事情。使用 Character.isDigit 遍历字符以检查是否应替换它们。如果是这样,只需使用 (character - '0') 作为索引在数组中查找替换字符串:

    String[] textArray =  new String[]{ "zero", "one", "two",
                                        "three", "four", "five",
                                        "six", "seven", "eight", "nine" };

    StringBuilder sb = new StringBuilder("abc 1 xyz 8");
    System.out.println(sb);

    for (int i=0; i<sb.length(); ++i) {
        char c = sb.charAt(i);
        if (Character.isDigit(c)) {
            sb.replace(i, i+1, textArray[c - '0']);
        }
    }
    System.out.println(sb);

输出为:

abc 1 xyz 8
abc one xyz eight