2011-09-26 95 views
1

好吧,我終於解決了這個問題,但我還剩下一個問題,當我在輸入字符串時被問到,如果我在程序運行時輸入的數字中放入任何空格將這些空格到我的輸出中的數字9,如果我不使用空格,一切運行良好,任何想法如何我可以阻止9被添加到我的空間?提前致謝。輸出問題Java

package chapter_9; 

import java.util.Scanner; 


public class Nine_Seven { 


    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 
     System.out.print("Enter a string: "); 
     String string = input.nextLine(); 
     string = string.toUpperCase(); 

     for (int i = 0;i<string.length();i++){ 
      if(Character.isDigit(string.charAt(i))) 
       System.out.print(string.charAt(i)); 
      else 
       System.out.print(getNumber(string.charAt(i))); 
      } 
     } 


    public static int getNumber(char uppercaseLetter){ 

     if (uppercaseLetter == 'A' || uppercaseLetter == 'B' || uppercaseLetter == 'C') 
      return 2; 
     else if (uppercaseLetter == 'D' || uppercaseLetter == 'E' || uppercaseLetter == 'F') 
      return 3; 
     else if (uppercaseLetter == 'G' || uppercaseLetter == 'H' || uppercaseLetter == 'I') 
      return 4; 
     else if (uppercaseLetter == 'J' || uppercaseLetter == 'K' || uppercaseLetter == 'L') 
      return 5; 
     else if (uppercaseLetter == 'M' || uppercaseLetter == 'N' || uppercaseLetter == 'O') 
      return 6; 
     else if (uppercaseLetter == 'P' || uppercaseLetter == 'Q' || uppercaseLetter == 'R' || uppercaseLetter == 'S') 
      return 7; 
     else if (uppercaseLetter == 'T' || uppercaseLetter == 'U' || uppercaseLetter == 'V') 
      return 8; 
     else 
      return 9; 
    } 


} 

輸出例如: 輸入字符串:597 6630

597 * * 6630

+1

您的邏輯表明您要將大寫字母轉換爲電話號碼。然而,你不限制什麼字符顯示9,而不是說它們不能是A-V。所以問問你自己,如果我通過你的程序發短信會發生什麼?按照if-then-else-if語句的順序進行跟蹤。另外,請閱讀Java switch語句。 – Marvo

回答

4

那麼看看getNumber()沒有 - 如果它不匹配任何的情況下,你「VE指定,則它返回9.

選項:

  • 將其更改爲針對空間顯式返回不同的數字
  • 將呼叫代碼更改爲不是如果值爲'',請致電getNumber()

我還建議重構調用代碼,只調用charAt(i)一次,只是爲了整潔。例如,您可能希望:

public static int getNumber(char uppercaseLetter) { 
    switch (upperCaseLetter) { 
     case 'A': case 'B': case 'C': 
      return 2; 
     case 'D': case 'E': case 'F': 
      return 3; 
     case 'G': case 'H': case 'I': 
      return 4; 
     case 'J': case 'K': case 'L': 
      return 5; 
     case 'M': case 'N': case 'O': 
      return 6; 
     case 'P': case 'Q': case 'R': case 'S' 
      return 7; 
     case 'T': case 'U': case 'V': 
      return 8; 
     default: 
      return 9; 
    } 
} 

(很明顯,你可以垂直堆疊的情況下,你應該想:

for (int i = 0; i < string.length(); i++){ 
    char c = string.charAt(i); 

    if (Character.isDigit(c) || c == ' ') { 
     System.out.print(c); 
    } else { 
     System.out.print(getNumber(c)); 
    } 
} 

正如在評論中指出,getNumber()也可以用一個簡單的開關/箱寫,以及...)

+0

和if語句可以重構爲switch/case語句(像這樣 - http://www.xefer.com/2006/12/switchonstring或here:http://stackoverflow.com/questions/338206/switch-statement -with-strings-in-java) – 2011-09-26 21:18:18

+0

@ 0A0D:對。也會爲此編輯... –

1

添加如果elsereturn 9;之間聲明僅適用於W,X,Y,Z輸出9和追加else return "";

0

稍微偏離主題但仍然重要:像這樣的大開關語句常常暗示您缺少某種對象抽象。我愛枚舉了這樣的情況,所以我會在一個枚舉封裝這個邏輯,也許是這樣的:

public enum PhoneDigit { 
    Zero(""), One(""), Two("ABC"), Three("DEF"), Four("GHI"), 
    Five("JKL"), Six("MNO"), Seven("PQRS"), Eight("TUV"), Nine(""); 

    private final String letters; 

    private PhoneDigit(String letters) { 
     this.letters = letters; 
    } 

    public boolean hasLetter(char character) { 
     return letters.contains(String.valueOf(character)); 
    } 

    public PhoneDigit valueOf(char character) { 
     for (PhoneDigit digit : values()) { 
      if (digit.hasLetter(character)) { 
       return digit; 
      } 
     } 

     return null; 
    } 
} 

這段代碼很容易測試,它在你的系統等的其他部分可重複使用的。雖然我「valueOf」方法並不像switch語句那麼高效,如果事情變得很重要,您可以很容易地改進它,而這是不太可能的。

現在,您可以爲此對象添加/測試其他方法,如getPhoneNumberFromString(String),boolean isPhoneDigit(char)等,不僅方法測試非常方便,而且將所有這些方法存儲在此位置也是合乎邏輯的。你的代碼會更容易閱讀,陽光會更加明亮,這將是你做過的購買SlapChop的最好的東西。

最後,請注意,您可以免費獲得有用的方法,如values()ordinal()等。

祝你好運!