Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 罗马数字到整数:我的代码怎么了_Java_Roman Numerals - Fatal编程技术网

Java 罗马数字到整数:我的代码怎么了

Java 罗马数字到整数:我的代码怎么了,java,roman-numerals,Java,Roman Numerals,所以我想把罗马数字转换成整数。到目前为止,我得到的是: 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

所以我想把罗马数字转换成整数。到目前为止,我得到的是:

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,但是当我创建一个tester类来尝试这一点时,它什么也不返回,并且一直让我输入一个新行

为了记录在案,这是我的测试课程

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);

    }
}

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

while(substring.equals("I")) {
    number = number+1;
    last = last +1;
    first=first +1;
}
如果程序进入该循环,它将卡在那里,因为您没有更改
子字符串的值。因此
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;
}
它将提供的字符串转换为大写(
viii
->
viii
),以避免检查每个
char
的两个大小写,并将其转换为
char
数组。此数组将用于
foreach
循环中,该循环获取它的每个条目,并在
开关
块中对其进行测试。每个受支持的罗马数字都有自己的
大小写
,以相应地递增
数字
。目前它支持代码中的
I
V
类。顺便说一句,
number+=1
只是
number=number+1
的一个简短版本


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

while(substring.equals(“I”))
。。。在哪里更改
子字符串
,以便返回
false
?你的程序不允许你输入东西,它卡在一个无限循环中。String类有一个charAt(int index)方法,可以用来获取特定位置的字符,正如你所知道的。我有点认为它卡在一个无限循环中,但是当我想要它时,我如何让它返回false呢