如何在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
相关产品推荐
相关产品推荐

