用子串搜索输入

时间:2014-11-28 23:42:09

标签: java string substring

我试图用子串来计算阿拉伯数字中罗马数字相等的东西, 并且我不断得到索引超出范围错误。 或者,我有另一种方式,它只会读取第二个数字并完全忽略第一个数字。

System.out.println("What is the number you want converted?");
Scanner scan = new Scanner(System.in);
String Roman = scan.next();
int sum = 0;

for (int x = 0; x<Roman.length(); x++)
 {
  if (Roman.substring(x,(x+2)).equals("XC"))   
  {
    sum= sum+90;
  }    
  else if (Roman.substring(x,(x+1)).equals("IX"))
  {
    sum= sum+9;
  }   
  else if (Roman.substring(x).equals("X"))
  {
    sum= sum+10;
  }   
  else if (Roman.substring(x,(x+2)).equals("IV "))  
  {   
       sum= sum+4;
  }
    else if (Roman.substring(x).equals("V"))
  {
    sum= sum+5;
  } 
  else if (Roman.substring(x).equals("I"))
    {   
       sum= sum+1;
    }  
  else if (Roman.substring(x).equals("L"))
    {       
        sum= sum+50;
  }
  else if(Roman.substring(x).equals("C"))
  {
    sum= sum+100;
  }
} 
System.out.println(sum);

3 个答案:

答案 0 :(得分:0)

代码存在两个问题:

  1. 即使你在字符串的末尾,你也在x+2x+1。这导致异常。当剩下不止一个字符时,请确保您只查找XI的XC。

  2. 当你读到的字符超过一个符号时,你没有前进,你指的是你正在阅读的符号的长度。这样你可以两次读同一个角色。因此,如果你阅读XC,你应该再增加x次。

答案 1 :(得分:0)

你有几个问题:

  1. 当匹配2个字符的子串时,你将离开字符串的末尾。
  2. 您一次只匹配两个字符,而只是单独循环。
  3. 第一个导致你的问题。

    快速而又脏的方法是将if (Roman.length()>= x+2 &&添加到每个双字符子串中,并在代码块中添加x++。即:

    else if (Roman.length() >= x+2 && Roman.substring(x,(x+2)).equals("IV "))  
    {   
         sum= sum+4;
         x++;
    }
    

    这是超级hacky,肯定有更好的方法来解决这个问题。

答案 2 :(得分:0)

巧合的是,我今晚告诉朋友这个问题,他提出了这个相当紧凑的解决方案。比较彼此相邻的两个数字,并且取决于下一个数字是大于还是小于它之前的数字,将其相减或相加。我在这里添加了他的解决方案,也许它可以帮到你。 Stackoverflow上还有一些其他很好的解决方案。请参阅:Converting Roman Numerals To Decimal

import acm.program.*;

public class RomanNumeralsToArabic extends ConsoleProgram {

public void run() {

    /* Read in the roman numeral from the user and store it as a String. */ 
    String romanNumber = readLine("Enter roman number: ");

    /* Initialize the array to store the arabic equivalents of the roman numerals in. */
    int[] arabicArray = new int[romanNumber.length()];

    /* Loop through the charachters of the roman number and store the arabic equivalents in the array. */
    for (int i = 0; i < romanNumber.length(); i++) {
        char ch = romanNumber.charAt(i);
        switch (ch) {
            case 'M': arabicArray[i] = 1000; break;
            case 'D': arabicArray[i] = 500; break;
            case 'C': arabicArray[i] = 100; break;
            case 'L': arabicArray[i] = 50; break;
            case 'X': arabicArray[i] = 10; break;
            case 'V': arabicArray[i] = 5; break;
            case 'I': arabicArray[i] = 1; break;
        }
    }

    /* The last roman numeral is always added to the total no matter what it is. */
    int result = arabicArray[arabicArray.length - 1];

    /* Loop through the array with arabic numbers. If the number in the next bucket is
     * less than the one before it, subtract the number. If it is bigger, add it. */
    for (int j = 0; j < arabicArray.length - 1; j++) {
        if (arabicArray[j] >= arabicArray[j + 1]) {
            result += arabicArray[j];
        } else {
            result -= arabicArray[j];
        }
    }

    /* Print out the result to the screen. */
    println("Arabic number: " + result);

}

}