Java单词转电话号码代码异常:非预期输出排查与修正咨询
问题原因及修正方案
问题根源
你看到的"垃圾值"本质是字符与数字相乘时的类型转换错误,同时代码还存在隐藏的逻辑问题:
hm1中存储的是字符类型(比如'1'),Java里char会自动转成对应的ASCII码值('1'对应49,'2'对应50,'4'对应52)。原代码里freq*hm1.get(str)是把ASCII码值和频率相乘,得到的是数字(比如1*49=49),直接拼到字符串里就成了数字的字符串形式,而非目标字符重复freq次。- 针对你的输入,错误过程是:
- "one" → 1*49=49 → res="49"
- "double two" → 2*50=100 → res="49100"
- "triple four" →3*52=156 → res="49100156",这就是你看到的错误结果。
- 另外原代码的
freq*=hm2.get(str)会叠加频率,但实际需求里double/triple是单独修饰下一个数字的次数,不是叠加(比如"double triple four"应该是4重复3次,不是6次)。
修正方案
核心修正点
- 把字符转成字符串后重复freq次,而非对ASCII码值相乘。
- 频率赋值改成直接覆盖,不是叠加。
具体实现(两种方式)
方式1:Java 11+ 用String.repeat()(简洁高效)
修改循环中的逻辑:
for(String str:arr){ if(hm2.containsKey(str)){ freq = hm2.get(str); // 直接赋值,不叠加频率 }else{ char numChar = hm1.get(str); res += String.valueOf(numChar).repeat(freq); // 重复目标字符freq次 freq = 1; } }
方式2:兼容低版本Java(手动循环拼接)
如果你的Java版本低于11,用循环实现重复拼接:
for(String str:arr){ if(hm2.containsKey(str)){ freq = hm2.get(str); }else{ char numChar = hm1.get(str); for(int i=0; i<freq; i++){ res += numChar; } freq = 1; } }
完整修正后的代码
import java.util.*; public class temp{ public static void main(String args[]){ String phone_string="one double two triple four"; String[] arr=phone_string.split(" ",0); int freq=1; String res=""; HashMap<String,Character> hm1=new HashMap<>(); hm1.put("zero",'0'); hm1.put("one",'1'); hm1.put("two",'2'); hm1.put("three",'3'); hm1.put("four",'4'); hm1.put("five",'5'); hm1.put("six",'6'); hm1.put("seven",'7'); hm1.put("eight",'8'); hm1.put("nine",'9'); HashMap<String,Integer> hm2=new HashMap<>(); hm2.put("double",2); hm2.put("triple",3); for(String str:arr){ if(hm2.containsKey(str)){ freq = hm2.get(str); }else{ char numChar = hm1.get(str); res += String.valueOf(numChar).repeat(freq); freq = 1; } } for(int i=0;i<arr.length;i++){ System.out.print(arr[i]+" "); } System.out.println(res); // 输出:122444 } }
内容的提问来源于stack exchange,提问作者dummy
相关产品推荐
相关产品推荐

