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

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");
    }
}

问题分析

  1. 阿拉伯数字转罗马数字返回null:
    • 你的setNumber方法只是把传入的数字赋值给number字段,但没有生成对应的roman字符串;toString()直接返回roman,而roman初始值是null,所以输出都是null。
  2. 罗马数字转阿拉伯数字结果错误:
    • 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;
    }
}

修正说明

  1. setNumber方法:添加了调用convertToRoman的逻辑,赋值数字后自动生成对应的罗马字符串,解决null问题。
  2. setRoman方法:添加了调用convertToNumber的逻辑,赋值罗马字符串后自动解析成阿拉伯数字,解决结果错误问题。
  3. toString():去掉了多余的\n,因为Main类里用的是println,会自动换行,避免输出空行。
  4. 新增两个私有转换方法:利用你已经定义好的NUMBERS和LETTERS数组实现转换逻辑,完全复用了你原来的核心设计,没有改动你难以理解的结构。

Main类检查

你的Main类本身没有问题,修正RomanNumeral类后,运行Main类就能得到你期望的正确输出了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:42:30