Java中比较HashMap值时for循环与if语句失效问题排查
罗马数字转整数代码问题排查与修复
你的代码里有几个关键问题,导致传入"MMXVIII"时始终返回默认值:
核心问题分析
循环根本没执行
原循环条件for(int i=num.length()-1;i<0;i--)完全错误——初始i是字符串最后一个索引(比如"MMXVIII"长度为6,i=5),5 < 0不成立,循环直接跳过,result保持默认的null,自然返回默认值。result未初始化
类成员变量Integer result;默认值是null,就算循环能执行,result += ...也会直接抛出空指针异常。遍历逻辑越界且逻辑颠倒
原代码里直接取i-1,当i=0时会触发字符串索引越界;而且从右往左的计算逻辑搞反了,应该先拿最右侧的值当初始结果,再向左逐个比较加减。冗余变量
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
相关产品推荐
相关产品推荐

