patternjavaMinor
Phone keypad implementation
Viewed 0 times
implementationphonekeypad
Problem
I was wondering, beyond the standard improvements that this needs, is there a more "clever" way of solving this problem?
The problem is to translate letters into digits without changing the format of the original string. The conversion is based on the international standard letter/number mapping on phones (i.e. where ABC is 2, DEF is 3, ..., PQRS is 7, TUV is 8, and WXYZ is 9).
The problem is to translate letters into digits without changing the format of the original string. The conversion is based on the international standard letter/number mapping on phones (i.e. where ABC is 2, DEF is 3, ..., PQRS is 7, TUV is 8, and WXYZ is 9).
public class Keypad {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter a string: ");
String s = input.nextLine();
System.out.println(getNumbers(s));
}
public static String getNumbers(String s) {
String result = new String();
//Read and append s onto result
for (int i = 0; i < s.length(); i++) {
if (Character.isLetter(s.charAt(i))) {
result += getNumber(Character.toUpperCase(s.charAt(i)));
}
else {
result += s.charAt(i);
}
}
return result;
}
public static int getNumber(char upperCaseLetter) {
int number = ((upperCaseLetter - 'A') / 3) + 2;
if (number < 7) {
return number;
}
else if (upperCaseLetter - 'A' < 20) {
return 7;
}
else if (upperCaseLetter - 'A' < 23) {
return 8;
}
else {
return 9;
}
}
}Solution
A much simpler solution would be to use a lookup table. A mapping implemented using a lookup table would be easier to understand, with no magic numbers.
Furthermore, phone numbers are more numeric strings than numbers, so I'd make it a
Repeated string concatenation is bad for performance. To compose a string, use a
Furthermore, phone numbers are more numeric strings than numbers, so I'd make it a
char-to-char lookup.Repeated string concatenation is bad for performance. To compose a string, use a
StringBuilder.public class Keypad {
private static final char[] DIGITS = (
// ABC DEF
"222" + "333" +
// GHI JKL MNO
"444" + "555" + "666" +
// PQRS TUV WXYZ
"7777" + "888" + "9999").toCharArray();
public static String getNumbers(CharSequence s) {
StringBuilder result = new StringBuilder(s.length());
for (int i = 0; i < s.length(); i++) {
char c = Character.toUpperCase(s.charAt(i));
if ('A' <= c && c <= 'Z') {
result.append(DIGITS[c - 'A']);
}
}
return result.toString();
}
}Code Snippets
public class Keypad {
private static final char[] DIGITS = (
// ABC DEF
"222" + "333" +
// GHI JKL MNO
"444" + "555" + "666" +
// PQRS TUV WXYZ
"7777" + "888" + "9999").toCharArray();
public static String getNumbers(CharSequence s) {
StringBuilder result = new StringBuilder(s.length());
for (int i = 0; i < s.length(); i++) {
char c = Character.toUpperCase(s.charAt(i));
if ('A' <= c && c <= 'Z') {
result.append(DIGITS[c - 'A']);
}
}
return result.toString();
}
}Context
StackExchange Code Review Q#90079, answer score: 4
Revisions (0)
No revisions yet.