2014-11-05 26 views
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; 

} 

很顯然,我只有我和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」))'......你在哪裏改變'substring',所以這可能會返回'false'?你的程序不會讓你輸入東西,它會陷入無限循環。 – Tom 2014-11-05 00:21:54

+0

String類有一個charAt(int index)方法,可用於在特定位置獲取角色,就如你所知。 – jrahhali 2014-11-05 00:23:50

+0

我有點認爲它卡在一個無限循環中,但是如何讓它在我想要的時候返回false – Matt 2014-11-05 00:34:03

回答

0

你的問題是這樣一個循環:

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循環中,並在switch塊中對其進行測試。每個支持的羅馬數字都有自己的case,因此相應地增加了number。目前它支持IV類似於你的代碼。 Btw,number += 1只是number = number + 1的簡短版本。

在那個循環之後,它返回轉換後的整數值。