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

时间:2010-02-08 14:39:19

标签: java

只启动java,需要一个程序将手机按钮上的字母转换为数字。

e.g。 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");    
         }    


    }

}

7 个答案:

答案 0 :(得分:7)

您应该使用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 {{1}分组的事实} TUV

所以你可以直接划分输入字符:

WXYZ

编辑:请注意,此方法会返回键盘的从零开始的索引。

答案 1 :(得分: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'));
}

答案 2 :(得分:1)

您的类具有主方法的错误方法签名。 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;

    }

}

答案 3 :(得分:0)

虽然可能有方法可以改进布局并解决这个问题,但如果你想让它工作,我会看一下与“==”运算符进行字符串比较。请查看.equals()代替字符串。我假设你在这里使用Java,但你的标签建议使用jquery。你能澄清一下你在用什么吗?

答案 4 :(得分:0)

你知道A与a不同,对吗?所以,如果你想这样,你应该添加更多的||每个字母的条款。例如:

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

或者只是将toUpper添加到输入字母?

答案 5 :(得分:0)

虽然可能不是您问题的直接答案,但您可以从以下方面获益:

在主函数体中,您正在混合业务逻辑部分 (使用特定于任务的详细信息将结果打印到stdout)。 通过这样做,您可以创建非常难以维护的代码。如果 您想要将数字放在文本字段而不是打印 它?然后你必须改变所有的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)))
    }


}

您的代码更易于更改,测试和阅读。

分离逻辑所在的原则是一个 非常重要的技能,没有充分的理由不总是 练习它。

答案 6 :(得分: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++;
                }
            }
        }     
    }
}