2015-10-07 52 views
1

我正在學習Java,我需要編寫一個程序來轉換羅馬數字和傳統整數。如何檢查一個字符串是否包含與Java中給定範圍不同的字母

該代碼只接受字母MDCLXVI作爲羅馬數字。它不接受任何號碼。

這是我的代碼:

System.out.print("Enter a roman numeral"); 
      Scanner keyb = new Scanner(System.in); 
      String roman = keyb.next(); 

      if(roman.matches(".*[0-9].*") || **something different then M, D, C, L, X, V or I**) 
     { 
      System.out.println("Wrong! Re-type."); 
     } 

,我試圖解決的是如何寫If的第二個條件的問題。

+1

嘗試正則表達式和模式匹配 –

回答

0

首先關閉所有你要檢查如果給定的羅馬數字是否有效。因此,該方法可能如下所示:

public static boolean isValid(String romanNumber) { 
    String pattern = "[m|d|c|l|x|v|i]*"; 
    Pattern p = Pattern.compile(pattern); 
    Matcher m = p.matcher(romanNumber); 

    return m.matches(); 
} 

然後,您可以在您的轉換器方法中使用這一個。做完這些之後,有必要轉換羅馬字符串中的每個字符。所以你可以通過創建一個switch函數來實現,它可以在for循環中使用。

public static int convertCharacter(String romanNumber, int position) { 
    char c = romanNumber.charAt(position); 
    switch (c) { 
     case 'm': 
      return 1000; 
     case 'd': 
      return 500; 
     case 'c': 
      return 100; 
     case 'l': 
      return 50; 
     case 'x': 
      return 10; 
     case 'v': 
      return 5; 
     case 'i': 
      return 1; 
     default: 
      return 0; 
    } 
} 

由於您是Java新手,因此我會告訴您如何編寫轉換器方法。這不是最好的解決方案,但它對我有用。使用這一個,它也可以轉換像「MCMXCIX」這樣的數字。

我刪除了評論。所以試着去理解代碼的作用。否則,你不會從中學習。

public static int convertRomanNumber(String romanNumber) { 
    romanNumber = romanNumber.toLowerCase(); 

    if (!isValid(romanNumber)) { 
     System.out.println("Invalid character detected"); 
     System.exit(0); 
    } 

    int result = 0; 
    int currentNumber; 
    int nextNumber; 

    for (int i = 0; i < romanNumber.length(); i++) { 
     currentNumber = convertCharacter(romanNumber, i); 
     if (i < romanNumber.length() - 1) { 
      nextNumber = convertCharacter(romanNumber, i + 1); 
      if (nextNumber > currentNumber) { 
       result += currentNumber * -1; 
      } else { 
       result += currentNumber; 
      } 
     } else { 
      result += currentNumber; 
     } 
    } 

    System.out.println("Your input: " + romanNumber.toUpperCase()); 

    return result; 
} 

我希望它可以幫助你的未來。

一切順利。

0

首先我用toLowerCase()來小寫用戶輸入,然後用matches()來檢查用戶輸入是否等於M D C L X V I這個字符。

String user_input = "M"; 

if (user_input.toLowerCase().matches("m|d|c|l|x|v|i")){ 
    System.out.println("Matches"); 
} 
0

您可以使用此:

if(roman.matches(".*[0-9].*") || 
      !roman.matches("[MDCLXVI]")) 

這種不區分大小寫:

if(roman.matches(".*[0-9].*") || 
      !roman.matches("(?i)[MDCLXVI]")) 
+0

謝謝你,但你的代碼沒有工作。我得到了這個'if(romain.matches(「。* [0-9]。*」)||!romain.matches(「[M | D | C | L | X | V | I] *」 ))' – Rods2292

+0

你能告訴我你嘗試了什麼字符串,結果是什麼? – gmconte