繁体   English   中英

使用电话标准将字母转换为数字

[英]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数组。

另外,考虑将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;

    }

}

尽管可能有多种方法可以改善布局并解决该问题,但是如果您想使其起作用,我将考虑使用“ ==”运算符进行字符串比较。 在.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM