2010-02-08 69 views
1

只有啓動java,需要一個程序將手機按鈕上的字母轉換爲數字。使用手機標準將字母轉換爲數字

例如a = 2或v = 8。我已經嘗試了一些方法,它編譯好,但不會給我答案?

public class digits 

{ 
    public static void main (String letter) 

    { 

     if (letter=="A" || letter=="B" || letter== "C") 
     { 
      System.out.println("1"); 
     } 

     else if(letter=="D" || letter=="E" || letter== "F") 
     { 
      System.out.println("2"); 
     } 

     else if (letter=="G" || letter=="H" || letter== "I") 
     { 
      System.out.println("3"); 
     } 
     else if (letter=="J" || letter=="K" || letter== "L") 
     { 
      System.out.println("4");  
     } 
     else if (letter=="M" || letter=="N" || letter== "O") 
     { 
      System.out.println("5");  
     }  

     else if (letter=="P" || letter=="Q" || letter== "R" || letter== "S") 
     { 
      System.out.println("6");  
     }  

     else if (letter=="T" || letter=="U" || letter== "V") 
     { 
      System.out.println("7");  
     }  

     else if (letter=="W" || letter=="X" || letter== "Y" || letter== "Z") 
     { 
      System.out.println("9");  
     }  


    } 

} 
+6

這味道就像做家庭作業。 – 2010-02-08 14:43:09

+0

當然可以編譯,但它可能不能作爲獨立運行。 public static void main(String letter)需要public static void main(String [] letter) – Photodeus 2010-02-08 15:02:17

+1

在我的iPhone上,字母「ABC」在2上,而不是在1上。 – 2010-02-08 15:11:50

回答

0

雖然有可能會改善的佈局和方法解決這個問題,如果你想它的工作方式,我想看看這樣做與「==」操作字符串比較。代替字符串查看.equals()。我假設你在這裏使用Java,但你的標籤建議jQuery。你能澄清你正在使用的是什麼?

7

您應該使用equals方法,而不是使用==進行檢查。

通過避免奇怪的事情會更好得到的只是字符串的第一個字符,並與正常的比較檢查的方式:

public static void main(String[] args) 
{ 
    char c = args[0].toLowerCase().charAt(0); 

    if (c == 'a' || c == 'b' || c == 'c') 
      .... 
} 

後來想想一個事實,即主要方法提供一個字符串陣列,而不是一個。

一個更優雅的方式應該考慮到的信件被ABCDEFGHI​​MNOPQRSTUVWXYZ

分組的事實,這樣你就可以直接將輸入字符:

char c = args[0].toLowerCase().charAt(0); 
int which = (c - 'a')/3; 

if (which <= 5) 
    return which; 
else if (which == 8) 
    return which - 1; 
else // can be S T U or V W X 
    if (which % 3 == 0) // it's S or V 
    return which - 1; // return the previous key 
    else 
    return which; 

編輯:心靈該方法返回鍵盤的從零開始的索引。

+2

如果你打算使用'char',你最好使用switch語句,結果代碼將會更清晰... – 2010-02-08 14:46:50

+0

是的,但我寫這個不同的方法..這就是爲什麼我不在乎開關:D導致一連串的比較可以相當減少,假設該模式是相當規律的。 – Jack 2010-02-08 14:51:14

+0

我想知道爲什麼人們只需點擊投票而不解釋他們自己。改善事情會很有用。 – Jack 2010-02-08 16:30:16

0

你知道A不同於A,對吧?所以,如果你想這樣做,你應該添加更多的||每一封信的條款。例如:

if (letter=="A" || letter=="B" || letter== "C" || letter=="a" || letter=="b" || letter== "c") 

或者只是將你的輸入字母添加到上面?

1

你的類對主方法有錯誤的方法簽名。 main總是接受一個字符串數組。

此外,考慮使用charswitch聲明。

這裏是存放在不同的功能,這樣的例子(目前未經):

public class digits 
{ 
    public static int phoneCharToDigit (char letter) 
    { 
     letter = Character.toUpperCase(letter); 
     int value = 0; 

     switch(letter) { 
      case 'A': 
      case 'B': 
      case 'C': 
       // Yes, 2, your original code was wrong; there are no letters on 1 
       value = 2; 
       break; 

      case 'D': 
      case 'E': 
      case 'F': 
       value = 3; 
       break; 

      case 'G': 
      case 'H': 
      case 'I': 
       value = 4; 
       break; 

      case 'J': 
      case 'K': 
      case 'L': 
       value = 5; 
       break; 

      case 'M': 
      case 'N': 
      case 'O': 
       value = 6; 
       break; 

      case 'P': 
      case 'Q': 
      case 'R': 
      case 'S': 
       value = 7; 
       break; 

      case 'T': 
      case 'U': 
      case 'V': 
       value = 8; 
       break; 

      case 'W': 
      case 'X': 
      case 'Y': 
      case 'Z': 
       value = 9; 
       break; 

     } 
     return value; 

    } 

} 
5

我認爲,爲了封裝這個邏輯,是更好的使用對象:

class TelephoneKeyboard { 

    private final Map<Character, Integer> mapping; 

    public TelephoneKeyboard() { 
     mapping = new HashMap<Character, Integer>(); 
    } 

    public TelephoneKeyboard addKeys(Integer i, String characters) { 
     for (Character c : characters.toCharArray()) { 
      mapping.put(c, i); 
     } 

     return this; 
    } 

    public int getKey(char ch) { 
     return mapping.get(ch); 
    } 
} 

測試用例:

@Test 
public void keyboardTest() { 
    TelephoneKeyboard telephoneKeyboard = new TelephoneKeyboard(); 
    telephoneKeyboard.addKeys(2, "abc"); 
    telephoneKeyboard.addKeys(3, "def"); 
    telephoneKeyboard.addKeys(4, "ghi"); 
    telephoneKeyboard.addKeys(5, "jkl"); 
    // etc etc 
    assertEquals(2, telephoneKeyboard.getKey('a')); 
} 
0

雖然也許不會直接回答你的問題,以下是你會從改善中獲得很大收益:

在您的主要功能體中,您將業務邏輯部分 (將結果打印到標準輸出)與任務特定細節混合在一起。 通過這樣做,您可以創建非常難以維護的代碼。如果 你反而想把數字放在文本字段中而不是打印 呢?那麼你將不得不改變所有的println語句。如果您有時想要打印並有時更新文本字段,該怎麼辦? 你會添加一些,而不是測試每個地方?

通過在代碼中混合業務邏輯(我使用它作爲一個相當鬆散的術語, 如何處理結果)變得更加難以測試。 KISS的 原理教是有原因的,你會做明智的 試圖避免學習它的硬盤的方式:)

也許上面不是那麼清楚,我的意思是,如果你的代碼 有用以下方式編寫:

public class digits 

{ 
    public static int main letterToMobileDigit(char letterUpperOrLowerCase) 
    { 
     char letter = letterUpperOrLowerCase.toLowerCase(); 

     if (letter=='a' || letter=='b' || letter== 'c') 
     { 
      return 1; 
     } 

     else if(letter=='d' || letter=='e' || letter== 'f') 
     { 
      return 2; 
     } 

     else if (letter=='g' || letter=='h' || letter== 'i') 
     { 
      return 3; 
     } 
     else if (letter=='j' || letter=='k' || letter== 'l') 
     { 
      return 4; 
     } 
     else if (letter=='m' || letter=='n' || letter== 'o') 
     { 
      return 5; 
     }  

     else if (letter=='p' || letter=='q' || letter== 'r' || letter== 's') 
     { 
      return 6; 
     }  

     else if (letter=='t' || letter=='u' || letter== 'v') 
     { 
      return 7; 
     }  

     else if (letter=='w' || letter=='x' || letter== 'y' || letter== 'z') 
     { 
      return 9; 
     }  

     System.err.println("invalid char " + letter); // not the best or most elegant error handling, consider improving 
     return -1; 
    } 

    public static void main (String letter) 
    { 
     System.out.println(letterToMobileDigit(letter.charAt(0))) 
    } 


} 

你有更易於更改,測試和閱讀的代碼。

它所屬的邏輯分離原理是一個非常重要的技能,並且沒有很好的理由並不總是在練習 。

0

坦率地說,切換會更容易看;然而,如果你更喜歡 「if..else」你有沒有考慮過下面的問題?

The code below should run well as per the requirements. 

-------------------------------------------------------------------- 

import java.util.*; 

public class Question3Mod 
{ 
    public static void main(String[] args) 
    { 
     Scanner kb = new Scanner(System.in); 
     System.out.println("Enter phone number in letters: "); 
     String telInput = kb.nextLine(); 
     int i; 
     int count = 0; 

     System.out.print("Phone number you entered is: "); 

     for(i = 0; i <= telInput.length()-1; i++) 
     { 
      if(count == 3) 
      { 
       System.out.print("-"); 
      } 
      char phoneChar = telInput.charAt(i); 
      if (count == 7) 
      { 
       System.out.println(""); 
       break; 
      } 
      else{ 
       if( 
        phoneChar == 'A' || phoneChar == 'a' || 
        phoneChar == 'B' || phoneChar == 'b' || 
        phoneChar == 'C' || phoneChar == 'c') 
       { 
        System.out.print("2"); 
        count++; 
       } 
       else if(
         phoneChar == 'D' || phoneChar == 'd' || 
         phoneChar == 'E' || phoneChar == 'e' || 
         phoneChar == 'F' || phoneChar == 'f') 
       { 
        System.out.print("3"); 
        count++; 
       } 
       else if(
         phoneChar == 'G' || phoneChar == 'g' || 
         phoneChar == 'H' || phoneChar == 'h' || 
         phoneChar == 'I' || phoneChar == 'i') 
       { 
        System.out.print("4"); 
        count++; 
       } 
       else if(
         phoneChar == 'J' || phoneChar == 'j' || 
         phoneChar == 'K' || phoneChar == 'k' || 
         phoneChar == 'L' || phoneChar == 'l') 
       { 
        System.out.print("5"); 
        count++; 
       } 
       else if(
         phoneChar == 'M' || phoneChar == 'm' || 
         phoneChar == 'N' || phoneChar == 'n' || 
         phoneChar == 'O' || phoneChar == 'o') 
       { 
        System.out.print("6"); 
        count++; 
       } 
       else if(
         phoneChar == 'P' || phoneChar == 'p' || 
         phoneChar == 'Q' || phoneChar == 'q' || 
         phoneChar == 'R' || phoneChar == 'r' || 
         phoneChar == 'S' || phoneChar == 's') 
       { 
        System.out.print("7"); 
        count++; 
       } 
       else if(
         phoneChar == 'T' || phoneChar == 't' || 
         phoneChar == 'U' || phoneChar == 'u' || 
         phoneChar == 'V' || phoneChar == 'v') 
       { 
        System.out.print("8"); 
        count++; 
       } 
       else if(
         phoneChar == 'W' || phoneChar == 'w' || 
         phoneChar == 'X' || phoneChar == 'x' || 
         phoneChar == 'Y' || phoneChar == 'y' || 
         phoneChar == 'Z' || phoneChar == 'z') 
       { 
        System.out.print("9"); 
        count++; 
       } 
      } 
     }  
    } 
}