0

所以我正在尝试制作一个从罗马数字到整数的转换器。我到目前为止是这样的:

public int toNumber(String n){
   int number = 0;
   int first = 1;
   int last = 0;      
   String substring = n.substring (last, first);

   while(substring.equals("I")){
            number = number+1;
            last = last +1;
            first=first +1;
        }


   while(substring.equals("V")){
            number = number+5;
            last = last +1;
            first=first +1;
        }
        return number;

}

显然我现在只有 I 和 V,但是当我创建一个测试类来尝试这个时,它什么也没返回,并且一直让我换行。

作为记录,这是我的测试员课程

import java.util.Scanner;
public class Tester{
    public static void main (String[] args){
        RomanNumeralConverter quantity = new RomanNumeralConverter();
       Scanner user_input = new Scanner(System.in);

       //this is for roman to number  
          System.out.println("input roman numeral");
          String j  = user_input.nextLine(); 
          int g = quantity.toNumber(j);
          System.out.println(g);

    }
}

我几乎完全确定这是一个逻辑问题,但我不知道是什么,我觉得我已经尝试了我能想到的一切

4

1 回答 1

0

您的问题是这样的循环:

while(substring.equals("I")) {
    number = number+1;
    last = last +1;
    first=first +1;
}

如果程序进入那个循环,它会卡在那里,因为你没有改变substring. 因此substring.equals("I")将始终返回true,并且停止该循环的唯一方法是终止应用程序。

转换输入字符串的更好方法可能是:

public int toNumber(String n) {
    int number = 0;

    for (char chr : n.toUpperCase().toCharArray()) {
        switch(chr) {
            case 'I': number += 1;
                      break;
            case 'V': number += 5;
                      break;
            default: break;
        }
    }

    return number;
}

它将提供的 String 转换为大写 ( viii-> VIII) 以避免检查 every 的两种情况char并将其转换为char数组。该数组将在一个foreach循环中使用,该循环获取它的每一个条目并在一个switch块中对其进行测试。每个支持的罗马数字都有自己的相应case增加number。目前它在您的代码中支持I和喜欢。V顺便说一句,number += 1只是number = number + 1.

在该循环之后,它返回转换后的整数值。

于 2014-11-05T00:35:25.027 回答