根据具有 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
,因为String
是immutable
,这意味着如果您同时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<Character>
)。
【讨论】:
【参考方案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 判断字母,数字,空格,标点符号的方法。 (没有分了,请大家帮帮忙~谢谢~)