You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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次)。

修正方案

核心修正点

  1. 把字符转成字符串后重复freq次,而非对ASCII码值相乘。
  2. 频率赋值改成直接覆盖,不是叠加。

具体实现(两种方式)

方式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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:16:14