2014-11-05 7 views
0

Итак, я пытаюсь сделать конвертер с римских цифр целыми числами. То, что я до сих пор это:Roman Numeral to Integer: что не так с моим кодом

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; 

} 

Очевидно, у меня есть только я и 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); 

    } 
} 

Я почти полностью уверен, что это логическая задача, но я понятия не имею, что такое, и я чувствую, что я попробовал все, что я могу думать из

+2

'while (substring.equals (" I "))' ... и где вы меняете 'подстроку', чтобы это могло возвращать' false'? Ваша программа не позволяет вам вводить материал, он застрял в бесконечном цикле. – Tom

+0

Класс String имеет метод charAt (int index), который может использоваться для получения символа в определенном месте, просто чтобы вы знали. – jrahhali

+0

Я как бы понял, что он застрял в бесконечном цикле, но как мне заставить его вернуть false, когда я хочу, чтобы он – Matt

ответ

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

Он преобразует предоставленную строку в верхний регистр (viii ->VIII), чтобы избежать проверки обоих случаев каждого char и преобразует его в char массив. Этот массив будет использоваться в цикле foreach, который принимает каждую отдельную запись и проверяет его в блоке switch. Каждая поддерживаемая римская цифра имеет свой собственный case, чтобы увеличить number соответственно. В настоящее время он поддерживает I и V как в вашем коде. Btw, number += 1 - всего лишь короткая версия number = number + 1.

После этого цикла возвращается преобразованное целочисленное значение.