[英]Converting letters to digits using phone standard
仅启动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");
}
}
}
您应该使用equals
方法,而不要使用==
检查。
通过避免奇怪的事情,最好只获取字符串的第一个字符并通过常规比较进行检查:
public static void main(String[] args)
{
char c = args[0].toLowerCase().charAt(0);
if (c == 'a' || c == 'b' || c == 'c')
....
}
然后考虑以下事实:main方法提供了一个字符串数组 ,而不是单个字符串。
更为优雅的方法应考虑以下事实:字母由ABC
DEF
GHI
JKL
MNO
PQRS
TUV
WXYZ
分组
因此您可以直接分割输入字符:
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;
编辑 :记住这种方法返回键盘的从零开始的索引。
我认为,为了封装此逻辑,最好使用一个对象:
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'));
}
您的类的main方法的方法签名错误。 main
始终采用String数组。
另外,考虑将char
与switch
语句一起使用。
这是放在单独函数中的示例(目前尚未试用):
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;
}
}
尽管可能有多种方法可以改善布局并解决该问题,但是如果您想使其起作用,我将考虑使用“ ==”运算符进行字符串比较。 在.equals()中查找字符串。 我假设您在这里使用Java,但是您的标签建议使用jquery。 您能说明一下您正在使用什么吗?
您知道A与a不同吗? 因此,如果您想那样做,应该添加更多||。 每个字母的子句。 例如:
if (letter=="A" || letter=="B" || letter== "C" || letter=="a" || letter=="b" || letter== "c")
或者只是将toUpper添加到您的输入字母?
虽然可能无法直接回答您的问题,但以下几点将使您受益匪浅:
在您的主要功能主体中,您正在将业务逻辑部分(将结果打印到标准输出)与特定于任务的细节混合在一起。 通过这样做,您将创建很难维护的代码。 如果您想将数字放在文本字段中而不是打印该怎么办? 然后,您将必须更改所有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)))
}
}
您拥有的代码更易于更改,测试和阅读。
分离逻辑所属的原理是一项非常重要的技能,没有充分的理由不总是实践它。
坦率地说,切换会更容易看; 但是,如果您喜欢“ 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++;
}
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.