Java 将罗马数字异常转换为十进制

Java 将罗马数字异常转换为十进制,java,Java,对于一些课堂作业,我需要创建一个程序,将罗马数字转换为十进制形式。只要没有诸如IV或IX之类的异常字符,我就可以很好地进行转换。如何检查这些异常?我的尝试是将当前字符和下一个字符转换为十进制,然后比较它们,如果下一个字符(从右向左)较小,则减去它。问题是我从中得到了越界错误 我目前的代码是: Scanner keyboard = new Scanner(System.in); String roman; int decimal = 0; int number = 0;

对于一些课堂作业,我需要创建一个程序,将罗马数字转换为十进制形式。只要没有诸如IV或IX之类的异常字符,我就可以很好地进行转换。如何检查这些异常?我的尝试是将当前字符和下一个字符转换为十进制,然后比较它们,如果下一个字符(从右向左)较小,则减去它。问题是我从中得到了越界错误

我目前的代码是:

Scanner keyboard = new Scanner(System.in);
    String roman;
    int decimal = 0;
    int number = 0;

    System.out.print("Enter a Roman Numeral to convert to decimal form: ");

    roman = keyboard.next();
    roman = roman.toUpperCase();

    for (int count = roman.length()-1; count >= 0; count--)
    {
      char numeral = roman.charAt(count);
      switch (numeral){
        case 'I':
        decimal = 1;
        break;
        case 'V':
        decimal = 5;
        break;
        case 'X':
        decimal = 10;
        break;
        case 'L':
        decimal = 50;
        break;
        case 'C':
        decimal = 100;
        break;
        case 'D':
        decimal = 500;
        break;
        case 'M':
        decimal = 1000;
        break;
        default:
        System.out.println("Error: Invalid character detected.");
        break;
      }
      number = number + decimal;
    }

    System.out.println("The decimal equivalent is: " + number);
    System.out.println("Later!");
我还是一个初学者,我看到的关于这类问题的大部分信息都使用了我根本不懂的高级解决方案。我知道我需要比较角色,但我不确定如何做到这一点,最终不会超出界限

编辑:解决了!发布了这个问题后,我被洞察力所震撼,自己解决了这个问题。这段代码很有效,但我希望您能深入了解如何改进它

Scanner keyboard = new Scanner(System.in);
    String roman;
    int decimal = 0;
    int number = 0;
    int last = 0;

    System.out.println("This program converts Roman Numerals to decimal form.");
    System.out.println("Note: Roman Numerals are I, V, X, L, C, D and M.");
    System.out.println("All letters entered will be treated as capitalized.");
    System.out.print("Enter a Roman Numeral to convert to decimal form: ");

    roman = keyboard.next();
    roman = roman.toUpperCase();

    for (int count = roman.length()-1; count >= 0; count--)
    {
      char numeral = roman.charAt(count);
      switch (numeral){
        case 'I':
        decimal = 1;
        break;
        case 'V':
        decimal = 5;
        break;
        case 'X':
        decimal = 10;
        break;
        case 'L':
        decimal = 50;
        break;
        case 'C':
        decimal = 100;
        break;
        case 'D':
        decimal = 500;
        break;
        case 'M':
        decimal = 1000;
        break;
        default:
        System.out.println("Error: Invalid character detected.");
        System.exit(0); 
        break;
      }
      if (decimal >= last){
      number = number + decimal;
      }
      else {
      number = number - decimal;
      }
      last = decimal;
    }

    System.out.println("The decimal equivalent is: " + number);
    System.out.println("Later!");
好的,十进制是
。####
,整数是
#
,所以您可能应该将
半进制
更改为
num

如您所做的那样设置该数字,并在其后添加一个异常字符的检查。但首先要确保它的存在:

if(this character is not the first  &&  the previous character is an exception)
   adjust the number as necessary

这将避免越界异常。

您发布的代码似乎没有任何问题。问题是,对于条目,如果IV,它将打印6而不是4,因为它将从V中添加I和V,而不是从V中减去I。不过,我刚刚解决了这个问题,我将很快为同船的人发布解决方案。您应该发布您的解决方案工作代码作为答案。感谢您的回答!你认为它比我在编辑我的原始文章时使用的工具有用还是不有用?你的实现比我建议的更好、更优雅。按照您的方式,根本不需要检查
(当前字符-1)
,因为您当前的字符是在它之前读入的字符的前面。它避免了索引越界异常的全部可能性。聪明。我刚刚对你的问题投了赞成票,当你发布它时,我也会对你的答案投赞成票。谢谢!我需要更多的声誉,以便在8小时之前发布答案,但我会为未来遇到问题的学生更新答案。