将带有以字母表示的数字的字符串转换为字符串中的数字

时间:2017-07-19 03:58:54

标签: java string algorithm hashmap

//我们需要将xyzoneyctwothreefourvone转换为数字:1,234,1

public static void cal(String s){

    HashMap<String, String> map= new HashMap<String, String>();
    map.put("zero", "0");
    map.put("one", "1");
    map.put("two", "2");
    map.put("three", "3");
    map.put("four", "4");
    s = "xyzoneyctwothreefourvone";
    int temp;
    StringBuilder strB = new StringBuilder();
    ArrayList<StringBuilder> list = new ArrayList<StringBuilder>();
    StringBuilder strB1 = new StringBuilder();
    boolean isNum = false;

    for (int i = 0; i <= s.length() - 1; i++) {
        strB.append(s.charAt(i));
        if (strB.length() >= 3 && map.containsKey(strB.toString())) {
                isNum = true;
                strB1.append(map.get(strB.toString().toLowerCase()));
                strB = new StringBuilder();
            } else if (strB.length() > 5) {
                isNum = false;
                strB1.append("+");
                strB = new StringBuilder();
                i = i - 5;
            }
        }       

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

}

预期输出:+++ 1 ++ 234 + 1; 当前输出:+++ 1 ++ 234

1 个答案:

答案 0 :(得分:3)

这是因为只要满足(strB.length() > 5)条件,就会执行else语句。但最后,您的strB包含字符串vone,因此它没有足够的字符来执行此else语句。

但是,您也可以使用此代码实现此目的。它让事情变得简单:

for(Map.Entry<String, String> entry : map.entrySet()) {
    s = s.replaceAll(entry.getKey(), entry.getValue());
}

s = s.replaceAll("[a-z]", "+");

输出

+++1++234+1

参见DEMO:https://ideone.com/Mjo9D5