2011-09-26 145 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()等。

祝你好运!