Преобразование букв в цифры с использованием стандарта телефона - PullRequest
1 голос
/ 08 февраля 2010

Только для запуска java, нужна программа для преобразования буквы на кнопке мобильного телефона в число.

например. а = 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 ]

7 голосов
/ 08 февраля 2010

Вы должны использовать метод 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;

EDIT : помните, что этот подход возвращает индекс клавиатуры, начинающийся с нуля.

5 голосов
/ 08 февраля 2010

Я считаю, что для инкапсуляции этой логики лучше использовать объект:

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);
    }
}

TestCase:

@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'));
}
1 голос
/ 08 февраля 2010

Ваш класс имеет неправильную сигнатуру метода для метода 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;

    }

}
0 голосов
/ 22 июня 2017

Откровенно говоря, переключиться было бы проще на просмотр; Однако, если вы предпочитаете '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++;
                }
            }
        }     
    }
}
0 голосов
/ 08 февраля 2010

Хотя, возможно, это и не прямой ответ на ваш вопрос, вы можете значительно улучшить следующее:

В своем основном теле функции вы смешиваете часть бизнес-логики (вывод результата на стандартный вывод) с подробной информацией о задаче. Делая это, вы создаете код, который очень сложно поддерживать. Что, если вместо этого вы хотите поместить число в текстовое поле вместо печати Это? Тогда вам придется изменить все операторы 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)))
    }


}

у вас есть код, который намного проще изменить, проверить и прочитать.

Принцип отделения логики там, где она принадлежит, является чрезвычайно важный навык, и нет веских причин для не всегда практикуя это.

0 голосов
/ 08 февраля 2010

Вы знаете, что A отличается от a, верно? Итак, если вы хотите пойти по этому пути, вы должны добавить больше || пункт для каждого письма. Например:

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

или просто добавить toUpper к вашему вводному письму?

0 голосов
/ 08 февраля 2010

Хотя могут быть способы улучшить макет и подход к этой проблеме, но если вы хотите, чтобы это работало, я бы посмотрел на сравнение строк с помощью оператора "==" Вместо этого посмотрите .equals () для строк. Я предполагаю, что вы используете Java здесь, но ваш тег предлагает jquery. Не могли бы вы уточнить, что вы используете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...