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

如何在Java中为数组各元素动态切换罗马数字映射变量?

阿拉伯数字转罗马数字:动态切换罗马字符的实现方案

核心思路

提前定义好每一位(千、百、十、个)对应的罗马字符组,遍历数字数组时,根据当前索引直接取出对应的字符组,再执行已有的转换逻辑即可。

实现方式一:二维数组存储映射关系

这是最简洁的实现方式,直接用二维数组对应索引与字符组的关系:

// 索引对应digit数组的位置:0=千位,1=百位,2=十位,3=个位
private static final char[][] ROMAN_CHAR_GROUPS = {
    {'M', 'D', 'C'}, // 千位对应的a、b、c
    {'C', 'D', 'M'}, // 百位对应的a、b、c
    {'X', 'L', 'C'}, // 十位对应的a、b、c
    {'I', 'V', 'X'}  // 个位对应的a、b、c
};

public String convertDigitsToRoman(int[] digits) {
    StringBuilder romanResult = new StringBuilder();
    
    for (int i = 0; i < digits.length; i++) {
        int currentDigit = digits[i];
        // 根据索引获取当前位的罗马字符组
        char a = ROMAN_CHAR_GROUPS[i][0];
        char b = ROMAN_CHAR_GROUPS[i][1];
        char c = ROMAN_CHAR_GROUPS[i][2];
        
        // 这里替换成你已有的基础转换逻辑
        if (currentDigit == 0) {
            continue;
        } else if (currentDigit <= 3) {
            romanResult.append(String.valueOf(a).repeat(currentDigit));
        } else if (currentDigit == 4) {
            romanResult.append(a).append(b);
        } else if (currentDigit <= 8) {
            romanResult.append(b).append(String.valueOf(a).repeat(currentDigit - 5));
        } else if (currentDigit == 9) {
            romanResult.append(a).append(c);
        }
    }
    
    return romanResult.toString();
}

实现方式二:枚举类封装字符组(面向对象风格)

如果需要更好的可读性和扩展性,可以用枚举类来封装每一位的字符组:

// 枚举类定义每一位对应的罗马字符组
enum RomanCharSet {
    THOUSAND('M', 'D', 'C'),
    HUNDRED('C', 'D', 'M'),
    TEN('X', 'L', 'C'),
    UNIT('I', 'V', 'X');

    private final char a;
    private final char b;
    private final char c;

    RomanCharSet(char a, char b, char c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public char getA() { return a; }
    public char getB() { return b; }
    public char getC() { return c; }
}

public String convertDigitsToRoman(int[] digits) {
    StringBuilder romanResult = new StringBuilder();
    
    for (int i = 0; i < digits.length; i++) {
        int currentDigit = digits[i];
        // 通过索引获取对应的枚举实例
        RomanCharSet charSet = RomanCharSet.values()[i];
        char a = charSet.getA();
        char b = charSet.getB();
        char c = charSet.getC();
        
        // 执行你的基础转换逻辑
        if (currentDigit == 0) {
            continue;
        } else if (currentDigit <= 3) {
            romanResult.append(String.valueOf(a).repeat(currentDigit));
        } else if (currentDigit == 4) {
            romanResult.append(a).append(b);
        } else if (currentDigit <= 8) {
            romanResult.append(b).append(String.valueOf(a).repeat(currentDigit - 5));
        } else if (currentDigit == 9) {
            romanResult.append(a).append(c);
        }
    }
    
    return romanResult.toString();
}

说明

两种方式都能实现需求:

  • 二维数组方式代码更简洁,适合简单场景;
  • 枚举类方式可读性更强,后续如果需要扩展字符组或添加额外逻辑,维护成本更低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:50:34