Java中的罗马计算器问题。我的for循环

时间:2018-03-11 00:35:59

标签: java loops for-loop exception calculator

我正在为我正在学习的Java课程创建一个罗马数字计算器。以下方法应该采用Roman Numeral值并将其转换为整数。我在运行时不断收到StringIndexOutOfBoundsException错误,我不太明白我的错误在哪里。任何帮助,将不胜感激!

我已将罗马数字和相应的阿拉伯数字放入他们自己的数组中,如下所示:

private String[] romanArr = {"M", "D", "C", "X", "L", "V", "I"};

 private int[] arabicArr = {1000, 500, 100, 50, 10, 5, 1};

以下是我的转化方法:

int convert_from_Roman(String value)
 {  
     value.trim();
     int convertedValue = 0;


     for (int i = 0; i <= value.length(); i++)
     {   
        char romanVal = value.charAt(i);

        for(String romanNumeral : romanArr)
         {
             if (romanNumeral.equals(romanVal))
             {
                 convertedValue += arabicArr[romanNumeral.indexOf(i)];
             }
             else 
                 continue;
         } 
     } 

     return convertedValue;

     }

最后,这是我在main中的代码,我在其中创建变量数字并为其提供一个罗马数字字符串,以使用对象传递给方法 convert_from_Roman RomanCalculator 类并打印结果。:

RomanCalculator mc = new RomanCalculator();
 String numeral = "I";
 System.out.println(mc.convert_from_Roman(numeral) );

1 个答案:

答案 0 :(得分:0)

你可以在两个地方获得和结束异常。

首先是value.charAt(i),因为您使用<=代替<将索引超过1。您可以在此处获得例外StringIndexOutOfBoundsException

第二个位置在arabicArr[romanNumeral.indexOf(i)],变量 i 是输入字符串的当前索引,它被函数indexOf()视为char,这个当找不到char时函数返回-1,并且假设我将为0,1,2 ......,它将在第一次查找值为0的ascii代码时返回-1 ArrayIndexOutOfBoundsException

字符串 - 字符比较也将始终返回false

int convert_from_Roman(String value) {  
    value.trim(); // result of trim is ignored
    int convertedValue = 0;
    for (int i = 0; i <= value.length(); i++) { // your exceeding the index by 1
        char romanVal = value.charAt(i);
        for(String romanNumeral : romanArr) {
            if (romanNumeral.equals(romanVal)) { // string - char comparison
                 convertedValue += arabicArr[romanNumeral.indexOf(i)]; // wrong index
            }
            else 
                continue;
        } 
    } 
    return convertedValue;
}

修正了罗马方法的转换。

int convert_from_Roman(String value) {  
    String trimmed = value.trim(); // using the result of trim
    int convertedValue = 0;
    for (int digit = 0; digit < trimmed.length(); digit++) { // < instead <=
        char romanVal = trimmed.charAt(digit);
        for(int roman = 0; roman < romanArr.length; roman++) {
            if (romanArr[roman].equals(String.valueOf(romanVal))) // char char comparison
                convertedValue += arabicArr[roman]; // fixed index
            else
                continue;
        }
    }
    return convertedValue;
}