2016-11-29 13 views
0

Я пытаюсь написать программу, которая принимает номер телефона с буквами в нем и выводит номер телефона со всеми цифрами. Цифры, которые заменяют букву, определяются следующим ключом.Заменить буквы в строке с номерами в зависимости от буквы с классом символов

0 = none | 1 = none | 2 = ABC 
3 = DEF | 4 = GHI | 5 = JKL 
6 = MNO | 7 = PQRS | 8 = TUV 
     | 9 = WXYZ | 

Так что, если я получил номер телефона:

1-800-KILLERS 

Выход будет:

1-800-545-5377 

Это то, что я до сих пор. Я не выписал все случаи для оператора switch, но все они будут идти по строкам первых случаев: a, b и c.

public static void main(String[] args) { 
    Scanner stdin = new Scanner(System.in); 
    System.out.println("Enter a phone number or quit to exit"); 
    String number = stdin.nextLine(); 
    System.out.println(getNumber(number)); 
} 

public static int getNumber(String num) { 
    for (int i = 0; i < num.length() ; i++) { 
     if (Character.isLetter(i)) { 
      switch (num.charAt(i)) { 
       case 'A': 
       case 'C': 
        num.charAt(i) = "2" ; 
        break; 
       // etc 
      } 
     } 
    } 
} 
+2

Рассмотрите возможность создания карты, где ключ является символом, а значение - это номер –

+2

Кстати, что вы думаете? –

+1

Используйте 'StringBuilder', чтобы вы могли использовать [' setCharAt'] (https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html#setCharAt (int,% 20char)). Когда вы закончите, вызовите 'toString'. – 4castle

ответ

1
public static void main(String[] args) { 
     Scanner stdin = new Scanner(System.in); 
     System.out.println("Programmed By Jason Silva"); 
     System.out.println(); 
     System.out.println("Enter a phone number or quit to exit"); 
     String number = stdin.nextLine(); 
     System.out.println(getNumber(number)); 
     stdin.close(); 
    } 

    public static String getNumber(String numString) { 
     StringBuilder numStrBuilder = new StringBuilder(); // I used StringBuilder because String is Immutable. 
     for (int i = 0; i < numString.length(); i++) { 
      char tempChar = numString.toUpperCase().charAt(i); // declared it to block variable for ease of use. 
      if (Character.isLetter(tempChar)) { 
       switch (tempChar) { 
       case 'A': 
       case 'B': 
       case 'C': 
       numStrBuilder.append("2"); // Append this value to StringBuilder if the character is a Letter. 
        break; 
       case 'D': 
       case 'E': 
       case 'F': 
       numStrBuilder.append("3"); 
        break; 
       case 'G': 
       case 'H': 
       case 'I': 
       numStrBuilder.append("4"); 
        break; 
       case 'J': 
       case 'K': 
       case 'L': 
       numStrBuilder.append("5"); 
        break; 
       case 'M': 
       case 'N': 
       case 'O': 
       numStrBuilder.append("6"); 
        break; 
       case 'P': 
       case 'Q': 
       case 'R': 
       case 'S': 
       numStrBuilder.append("7"); 
        break; 
       case 'T': 
       case 'U': 
       case 'V': 
       numStrBuilder.append("8"); 
        break; 
       case 'W': 
       case 'X': 
       case 'Y': 
       case 'Z': 
       numStrBuilder.append("9"); 
        break; 
       } 
      } else { 
       numStrBuilder.append(tempChar); // Append the current character if it's not a letter. 
      } 

      if(i==8) { 
       numStrBuilder.append("-"); // Append 'dash' whenever it reaches the 8th element of the String for formatting. 
      } 
     } 
     return numStrBuilder.toString(); // Return it to String because you can't have character like 'dash' in a int. 
} 

Попробуйте это. Это будет работать. Я использовал StringBuilder, поскольку @ScaryWombat говорит, потому что String - immutable, означает, что есть много распределений памяти, которые были потрачены впустую, если вы concat много строк одновременно.

0

У вас есть функция правильно создана

Создание строки

String str = "";

Если символ в String, это число, чем идти через коммутатор случае

if (Character.isLetter(i)) { 

      switch (num.charAt(i)) { 

      case 'A': 
      case 'B': 
      case 'C': 
       str += "2" ; 
       break; 

else

str += number.charAt(i);

Я думаю, что это должно работать нормально

PS: Изменить тип возвращаемого значения в строку, но если вы хотите его как номер, который вы можете вызвать функцию внутри цикла и отправить один символ за раз чтобы получить целое число обратно вместо того, чтобы создать цикл внутри функции

+0

Какой вопрос вы отвечаете? –

+0

Я думаю, что он решает проблему без вопросов, но этот ответ имеет смысл. – msagala25

+0

@ScaryWombat Я думал, что он хочет знать, что он будет делать дальше. Вопрос путается, я попытался изо всех сил ответить на него –

-1

Определить карту, которая имеет характер, как ключ и число в качестве значения, как это, например:

HashMap<Character, Integer> map = new HashMap<Character, Integer>(); 
map.put('A', 2); 
map.put('B', 2); 
map.put('C', 2); 
map.put('D', 3); 
. 
. 
. 
for (int i = 0; i < num.length() ; i++) 
{   
    if (Character.isLetter(num.charAt(i))) 
    { 
     if (map.containsKey(num.charAt(i))) 
     { 
      num.replace(i, i + 1, String.valueOf(map.get(num.charAt(i)))); 
     } 
    }   
} 
+0

'replace' возвращает новую строку, поскольку строки неизменяемы. Рассмотрите возможность создания StringBuilder вместо –

0

Используйте карту и потоковой передачи символов посредством преобразования:

private static Map<Integer, Integer> map = new HashMap<Integer, Integer>() {{ 
    put('A', '2'); 
    put('B', '2'); 
    // etc for C through Y 
    put('Z', '9'); 
}}; 

static String toNumbers(String input) { 
    return input.chars() 
     .map(c -> map.getOrDefault(c, c)) 
     .mapToObj(c -> String.valueOf((char)c)) 
     .collect(Collectors.joining()); 
} 

Этот метод (1 линия) преобразует только буквы, сохраняя все небуквенные символы, такие как цифры, пробелы, дефисов, скобок и т.д., который обычно используется при вводе телефонных номеров.

Отметьте, что chars() возвращает IntStream (не Stream<Character>, как и следовало ожидать).

0

@Jason_Silva Вы можете посмотреть ниже код, который будет работать для всех условий и всех типов входов, как указано в приведенном выше описании.

public class Demo2 
    { 
    static int i; 
    static String str1; 
    public static void main(String[] args) { 
    Scanner sc=new Scanner(System.in); 
    System.out.println("Enter a series"); 
    String data=sc.nextLine(); 
    System.out.println(mtd(data)); 
    } 

    public static String mtd(String str){ 
    for(i=0;i<str.length();i++){ 
    if(i==9){ 
     str=str.substring(0,9)+"-"+str.substring(9,str.length()); 
    } 
    if(str.charAt(i)=='A'||str.charAt(i)=='B'||str.charAt(i)=='C'){ 
     str=str.replace(str.charAt(i),'2'); 

    } 
    if(str.charAt(i)=='J'||str.charAt(i)=='K'||str.charAt(i)=='L'){ 
      str=str.replace(str.charAt(i),'5'); 

     } 
    if(str.charAt(i)=='T'||str.charAt(i)=='U'||str.charAt(i)=='V'){ 
      str=str.replace(str.charAt(i),'8'); 

     } 
    if(str.charAt(i)=='J'||str.charAt(i)=='K'||str.charAt(i)=='L'){ 
      str=str.replace(str.charAt(i),'5'); 

     } 
      if(str.charAt(i)=='G'||str.charAt(i)=='I'||str.charAt(i)=='H'){ 
      str=str.replace(str.charAt(i),'4'); 

     } 
      if(str.charAt(i)=='P'||str.charAt(i)=='Q'||str.charAt(i)=='R'||str.charAt(i)=='S'){ 
      str=str.replace(str.charAt(i),'7'); 

     } 
    if(str.charAt(i)=='W'||str.charAt(i)=='X'||str.charAt(i)=='Y'||str.charAt(i)=='Z'){ 
      str=str.replace(str.charAt(i),'9'); 

     } 

    if(str.charAt(i)=='D'||str.charAt(i)=='E'||str.charAt(i)=='F'){ 
      str=str.replace(str.charAt(i),'3'); 

     } 
    if(str.charAt(i)=='M'||str.charAt(i)=='N'||str.charAt(i)=='O'){ 
      str=str.replace(str.charAt(i),'6'); 

     } 
else if(str.charAt(i)>=0 && str.charAt(i)<=9){ 
    break; 
} 
else if(str.charAt(i)!='-' && str.charAt(i)<'0' ||str.charAt(i)>'9' || str.charAt(i)>='a' && str.charAt(i)<='z'){ 
    String data=Character.toString(str.charAt(i)); 
    StringBuilder sb = new StringBuilder(str); 
    sb.deleteCharAt(i); 
    str=sb.toString(); 
    i=i-1; 
} 
} 
return str; 
} 
}