好的,我终于解决了这个问题,但我还有一个问题,当我在被问到时输入字符串,如果我在程序运行时输入的数字中放入任何空格,则将这些空格转换为数字9在我的输出中,如果我不使用空格一切运行良好,任何想法如何我可以阻止9被添加到我的空间?提前谢谢。
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 * 9 * 6630
答案 0 :(得分:4)
看看getNumber()
的作用 - 如果它与您指定的任何情况都不匹配,则返回9.
选项:
getNumber()
。我还建议重构一下调用代码只调用charAt(i)
一次,只是为了整洁。例如,您可能需要:
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()
也可以使用简单的开关/案例编写:
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;
}
}
(显然你可以根据需要垂直堆叠案例......)
答案 1 :(得分:1)
在else
和return 9;
之间添加if语句,仅为W,X,Y,Z输出9并附加else return "";
答案 2 :(得分: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()
等。