根据带有 Character class 的字母,将字符串中的字母替换为数字
Replace letters in a string with numbers depending on the letter with Character class
我正在尝试编写一个程序,它接受一个包含字母的 phone 数字,并输出包含所有数字的 phone 数字。替换字母的数字由以下键确定。
0 = none | 1 = none | 2 = ABC
3 = DEF | 4 = GHI | 5 = JKL
6 = MNO | 7 = PQRS | 8 = TUV
| 9 = WXYZ |
所以如果我得到 phone 号码:
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
}
}
}
}
您已正确创建函数
创建字符串
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:将您的 return 类型更改为字符串,但如果您希望它作为数字,您可以在循环中调用该函数并一次发送一个字符以取回整数在函数内部创建一个循环
定义一个以字符为键,以数字为值的映射,例如:
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))));
}
}
}
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
许多字符串,则会浪费很多内存分配。
使用地图并通过转换流式传输字符:
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()
returns 和 IntStream
(不是您所期望的 Stream<Character>
)。
@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;
}
}
我正在尝试编写一个程序,它接受一个包含字母的 phone 数字,并输出包含所有数字的 phone 数字。替换字母的数字由以下键确定。
0 = none | 1 = none | 2 = ABC
3 = DEF | 4 = GHI | 5 = JKL
6 = MNO | 7 = PQRS | 8 = TUV
| 9 = WXYZ |
所以如果我得到 phone 号码:
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
}
}
}
}
您已正确创建函数
创建字符串
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:将您的 return 类型更改为字符串,但如果您希望它作为数字,您可以在循环中调用该函数并一次发送一个字符以取回整数在函数内部创建一个循环
定义一个以字符为键,以数字为值的映射,例如:
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))));
}
}
}
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
许多字符串,则会浪费很多内存分配。
使用地图并通过转换流式传输字符:
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()
returns 和 IntStream
(不是您所期望的 Stream<Character>
)。
@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;
}
}