Java罗马数字与阿拉伯数字互转代码问题求助
罗马数字与阿拉伯数字互转Java程序问题排查
首先看一下你的问题核心:你的RomanNumeral类只做了字段赋值,但完全没有实现数字转罗马字符串和罗马字符串转数字的核心逻辑,这就是为什么会出现null和结果错误的原因。下面一步步给你修正,尽量保留你原来的核心结构(比如那两个静态数组的设计非常合理,我会继续用它们)。
问题代码回顾
RomanNumeral类
import static java.lang.System.*; public class RomanNumeral { private int number; private String roman; private final static int[] NUMBERS = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 }; private final static String[] LETTERS = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" }; public RomanNumeral(String roman) { setRoman(roman); } public RomanNumeral(int number) { setNumber(number); } public void setNumber(int number) { this.number = number; } public void setRoman(String roman) { this.roman = roman; } public int getNumber() { return number; } public String toString() { return roman + "\n"; } }
Main类
import static java.lang.System.*; public class Main { public static void main( String args[] ) { RomanNumeral test = new RomanNumeral(10); out.println("10 is " + test.toString()); test.setNumber(100); out.println("100 is " + test.toString()); test.setNumber(1000); out.println("1000 is " + test.toString()); test.setNumber(2500); out.println("2500 is " + test.toString()); test = new RomanNumeral(1500); out.println("1500 is " + test.toString()); test.setNumber(23); out.println("23 is " + test.toString()); test.setNumber(38); out.println("38 is " + test.toString()); test.setNumber(49); out.println("49 is " + test.toString()); test.setRoman("LXXVII"); out.println("LXXVII is " + test.getNumber() + "\n"); test.setRoman("XLIX"); out.println("XLIX is " + test.getNumber() + "\n"); test.setRoman("XX"); out.println("XX is " + test.getNumber() + "\n"); test.setRoman("XLIX"); out.println("XLIX is " + test.getNumber() + "\n"); } }
问题分析
- 阿拉伯数字转罗马数字返回
null:- 你的
setNumber方法只是把传入的数字赋值给number字段,但没有生成对应的roman字符串;toString()直接返回roman,而roman初始值是null,所以输出都是null。
- 你的
- 罗马数字转阿拉伯数字结果错误:
setRoman方法只是把传入的罗马字符串赋值给roman字段,没有解析成对应的阿拉伯数字;getNumber()返回的number要么是初始的0,要么是之前设置过的数字(比如你最后一次设置的49),所以所有罗马数字转换都返回49。
修正后的RomanNumeral类
我保留了你原来的核心结构(静态数组、字段、构造方法),只补充了转换逻辑,代码如下:
import static java.lang.System.*; public class RomanNumeral { private int number; private String roman; private final static int[] NUMBERS = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 }; private final static String[] LETTERS = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" }; public RomanNumeral(String roman) { setRoman(roman); } public RomanNumeral(int number) { setNumber(number); } public void setNumber(int number) { this.number = number; // 赋值后同步生成罗马数字 this.roman = convertToRoman(number); } public void setRoman(String roman) { this.roman = roman; // 赋值后同步解析成阿拉伯数字 this.number = convertToNumber(roman); } public int getNumber() { return number; } public String toString() { return roman; } // 去掉多余的换行,因为Main里已经有println了 // 私有方法:阿拉伯数字转罗马数字 private String convertToRoman(int num) { StringBuilder sb = new StringBuilder(); int remaining = num; for (int i = 0; i < NUMBERS.length; i++) { while (remaining >= NUMBERS[i]) { sb.append(LETTERS[i]); remaining -= NUMBERS[i]; } } return sb.toString(); } // 私有方法:罗马数字转阿拉伯数字 private int convertToNumber(String romanStr) { int result = 0; int index = 0; for (int i = 0; i < NUMBERS.length; i++) { while (romanStr.startsWith(LETTERS[i], index)) { result += NUMBERS[i]; index += LETTERS[i].length(); } } return result; } }
修正说明
setNumber方法:添加了调用convertToRoman的逻辑,赋值数字后自动生成对应的罗马字符串,解决null问题。setRoman方法:添加了调用convertToNumber的逻辑,赋值罗马字符串后自动解析成阿拉伯数字,解决结果错误问题。toString():去掉了多余的\n,因为Main类里用的是println,会自动换行,避免输出空行。- 新增两个私有转换方法:利用你已经定义好的
NUMBERS和LETTERS数组实现转换逻辑,完全复用了你原来的核心设计,没有改动你难以理解的结构。
Main类检查
你的Main类本身没有问题,修正RomanNumeral类后,运行Main类就能得到你期望的正确输出了。
内容的提问来源于stack exchange,提问作者Faheem
相关产品推荐
相关产品推荐

