根据具有 Character 类的字母,用数字替换字符串中的字母

Posted

技术标签:

【中文标题】根据具有 Character 类的字母,用数字替换字符串中的字母【英文标题】:Replace letters in a string with numbers depending on the letter with Character class 【发布时间】:2017-04-13 00:12:40 【问题描述】:

我正在尝试编写一个程序,该程序接受带有字母的电话号码并输出带有所有数字的电话号码。替换字母的数字由以下键确定。

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
            
        
    

【问题讨论】:

考虑创建一个键是字符,值是数字的映射 顺便问一下你的问题是什么? 使用StringBuilder,这样就可以使用setCharAt。完成后,致电toString 【参考方案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.

试试这个。它会起作用的。正如@ScaryWombat 所说,我使用StringBuilder,因为Stringimmutable,这意味着如果您同时concat 多个字符串,则会浪费许多内存分配。

【讨论】:

【参考方案2】:

你已经正确地创建了函数

创建一个字符串

String str = "";

如果 String 处的字符是数字,则通过 switch case

if (Character.isLetter(i) ) 

            switch (num.charAt(i)) 

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

else

str += number.charAt(i);

我认为这应该可以正常工作

PS:将返回类型更改为字符串,但如果您希望将其作为数字,您可以在循环内调用函数并一次发送一个字符以获取整数,而不是在函数内创建循环

【讨论】:

你在回答什么问题? 我认为他是在毫无疑问地解决问题,但这个答案是有道理的。 @ScaryWombat 我以为他想知道他接下来应该做什么。这个问题很混乱,我尽力回答了 嗯,不过我不会使用字符串 是的,我更喜欢 StringBuilder,因为 @ScaryWombat 说要附加字符串。【参考方案3】:

@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; 


【讨论】:

【参考方案4】:

使用地图并通过转换流式传输字符:

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&lt;Character&gt;)。

【讨论】:

【参考方案5】:

定义一个以字符为键,以数字为值的映射,例如:

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

【讨论】:

replace 返回一个新字符串,因为字符串是不可变的。考虑建立一个 StringBuilder 来代替

以上是关于根据具有 Character 类的字母,用数字替换字符串中的字母的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式将除 / 之外的所有非字母数字字符替换为空(“”)字符

JAVA 判断字母,数字,空格,标点符号的方法。 (没有分了,请大家帮帮忙~谢谢~)

python 输出所有大小写字母和0~9数字

用等效字母替换矩阵中的所有数字

JavaSE8基础 Character.isXXX 判断一个字符是 数字 小写字母 大写字母

[LeetCode] 424. Longest Repeating Character Replacement