已知:zero,one,two,three,four,five,six,seven,eight,nine分别对应0,1,2,3,4,5,6,7,8,9,对每一段含有这几种字符串的字符串进行转换,如:
输入:nineeightsevensixfivefourthreetwoonezero
输出:9876543210
数字的先后顺序不考虑。
代码:
public static String englishToNumber(String arr){
Map<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");
map.put("five", "5");
map.put("six", "6");
map.put("seven", "7");
map.put("eight", "8");
map.put("nine", "9");
String message = "";
while(!"".equals(arr)){
if (arr.startsWith("on") || arr.startsWith("tw") || arr.startsWith("si")) {
message += map.get(arr.substring(0, 3));
arr = arr.substring(3,arr.length());
}
if (arr.startsWith("ze") || arr.startsWith("fo") || arr.startsWith("fi") || arr.startsWith("ni")){
message += map.get(arr.substring(0, 4));
arr = arr.substring(4,arr.length());
}
if (arr.startsWith("th") || arr.startsWith("se") || arr.startsWith("ei")) {
message += map.get(arr.substring(0, 5));
arr = arr.substring(5,arr.length());
}
}
return message;
}
@Test
public void test(){
assert("1230".equals(One.englishToNumber("onetwothreezero")));
assert("5684".equals(One.englishToNumber("fivesixeightfour")));
assert("158465".equals(One.englishToNumber("onefiveeightfoursixfive")));
}
首先,先写了一个单元测试,然后来写具体的实现。具体的思路是把三个英文字母的,四个英文字母的和五个英文字母的分成三组。每一组里面处理字符串的方式(截取字符串的长度)是一样的,然后从Map中取出Value。使用到while循环,当目标字符串为空时不循环。
值得注意的是,这种比较笨的处理方式也有其局限性,当目标字符串较长时,while的执行体(即三个if的判断)内部的先后顺序会影响到执行的效果,最好的情况是三个if判断依次为TRUE,最坏的情况是每次都是最后一个if为TRUE。总而言这这个解答相当普通,暂时没有比较好的解法。
程序中出现的错误主要包含两点:
a.用==来比较字符串是否相等,应该有equals()等方法
b.对subString(a,b)的使用容易引发数组越界的异常