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

Java中比较HashMap值时for循环与if语句失效问题排查

罗马数字转整数代码问题排查与修复

你的代码里有几个关键问题,导致传入"MMXVIII"时始终返回默认值:


核心问题分析

  1. 循环根本没执行
    原循环条件for(int i=num.length()-1;i<0;i--)完全错误——初始i是字符串最后一个索引(比如"MMXVIII"长度为6,i=5),5 < 0不成立,循环直接跳过,result保持默认的null,自然返回默认值。

  2. result未初始化
    类成员变量Integer result;默认值是null,就算循环能执行,result += ...也会直接抛出空指针异常。

  3. 遍历逻辑越界且逻辑颠倒
    原代码里直接取i-1,当i=0时会触发字符串索引越界;而且从右往左的计算逻辑搞反了,应该先拿最右侧的值当初始结果,再向左逐个比较加减。

  4. 冗余变量
    Character[] input;从来没用到,直接删掉就行。


修复后的完整代码

import java.util.HashMap;

public class Rtoi{

    private final HashMap<Character, Integer> rn = new HashMap<>();

    public Rtoi(){
        rn.put('I', 1);
        rn.put('V', 5);
        rn.put('X', 10);
        rn.put('L', 50);
        rn.put('C', 100);
        rn.put('D', 500);
        rn.put('M', 1000);
    }

    public Integer convert(String num){
        // 处理空输入
        if(num == null || num.isEmpty()){
            return 0;
        }

        // 用最右侧字符的值初始化结果
        int result = rn.get(num.charAt(num.length()-1));

        // 从倒数第二个字符开始向左遍历
        for(int i = num.length()-2; i >= 0; i--){
            int currentVal = rn.get(num.charAt(i));
            int rightVal = rn.get(num.charAt(i+1));

            // 当前值小于右侧值则减,否则加
            if(currentVal < rightVal){
                result -= currentVal;
            } else {
                result += currentVal;
            }
        }
        return result;
    }
}

修复说明

  • 循环从倒数第二个字符开始遍历到0,既避免了索引越界,又能逐个和右侧字符比较;
  • 用最右侧字符的值初始化result,符合从右往左计算的罗马数字规则;
  • 逻辑调整为:当前字符的值比右边小就减(比如IV=5-1),否则加(比如VI=5+1);
  • 增加了空输入的判断,避免空指针;
  • 把rn设为final,防止被意外修改,同时删掉了没用的input变量。

测试"MMXVIII"时,会正确计算出2018。

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:50:44