有没有更好的方法来存储和检索字母在字母表中的位置给定的值?
Is there a better way to store and retrieve the values of letters given by their position in the alphabet?
我有一个作业要编写一个程序,将整数的数字和单词中的字母相加(每个字母的值由其在字母表中的位置给出,例如 j = 10)。经过一段时间试图找出一种方法来存储和检索每个字母的值后,我决定使用 HashMap ......但我想知道是否有更好的方法来做到这一点(我确定有)......所以我想得到一些关于如何改进代码和学习一些新东西的建议...谢谢!
import java.util.HashMap;
import java.util.Scanner;
public class NLS {
public static HashMap<Character, Integer> alphabet;
static {
alphabet = new HashMap<>();
alphabet.put('a', 1); alphabet.put('b', 2); alphabet.put('c', 3); alphabet.put('d', 4);
alphabet.put('e', 5); alphabet.put('f', 6); alphabet.put('g', 7); alphabet.put('h', 8);
alphabet.put('i', 9); alphabet.put('j', 10); alphabet.put('k', 11); alphabet.put('l', 12);
alphabet.put('m', 13); alphabet.put('n', 14); alphabet.put('ñ', 15); alphabet.put('o', 16);
alphabet.put('p', 17); alphabet.put('q', 18); alphabet.put('r', 19); alphabet.put('s', 20);
alphabet.put('t', 21); alphabet.put('u', 22); alphabet.put('v', 23); alphabet.put('w', 24);
alphabet.put('x', 25); alphabet.put('y', 26); alphabet.put('z', 27);
}
public static void main(String[] args) {
char keepGoing;
do {
int sum;
Scanner scan = new Scanner(System.in);
System.out.println("\n\n\n____________________________________________________________");
System.out.println("\n\tEnter a number [integer] or a word/sentence [no spaces]:\n");
String input = scan.nextLine();
boolean numeric = numberOrWord(input);
if (numeric) {
sum = digitSum(Integer.parseInt(input));
System.out.println("Result= " + sum);
} else {
char letter = calculateLetter(input);
System.out.println("Result= " + letter);
}
System.out.println("<<PRESS s/S TO CONTINUE>>");
keepGoing = scan.next().charAt(0);
} while (keepGoing == 's'||keepGoing == 'S');
}
public static boolean numberOrWord (String str){
try{
Double.parseDouble(str);
return true;
}catch(NumberFormatException e){
return false;
}
}
public static int digitSum(int number){
int sum = 0;
while(number > 0){
sum = sum + number % 10;
number /= 10;
}
return sum;
}
public static char calculateLetter(String word){
int sumPV = 0;
for(char digit : word.toCharArray()){
sumPV += alphabet.get(Character.toLowerCase(digit));
}
/* for(int i = 0, l = word.length(); i < l; i++){
char c = word.toLowerCase().charAt(i);
sumPV = sumPV + alphabet.get(c);
}*/
while(sumPV > 27){
sumPV =digitSum(sumPV);
}
char letter = (char) 0;
for(char key : alphabet.keySet()){
if(alphabet.get(key).equals(sumPV)) {
letter = key;
}
}
return letter;
}
}
每个字符都只是到整数值的映射,您可以打印它们的整数值以通过执行
等简单操作来查看 A -> 65
char d = 'D'; // D is just 68
这样做
d - 65 Or d - 'A'
两者的结果都是 3
您可以使用 char 的整数值表示,并像这样进行整数运算
public class Main
{
public static void main(String[] args) {
System.out.println("Hello World");
char a = 'A';
System.out.println(a - 'A' + 1); //Returns 1
a = 'B';
System.out.println(a - 'A' + 1); //Returns 2
}
}
[更新] 对于您的具体情况,您只需要在替换之前将 ñ 替换为 O
您可以使用 Character.getNumericValue()。
这将为您提供该字母的 ASCII 代码。
由于该代码对于 'a' 不是 1,因此您需要通过例如
进行补偿
int n = Caracter.getNumericValue(c) - Character.getNumericValue('a') + 1;
请注意,这仅在您只有小写字符时才有效。
另一种更接近您的代码的方法是简单地使用包含 'a' ... 'z' 的字符串并使用 indexOf(c).
String alphabet = "abcdefg...z";
int n = alphabet.indexOf("a") + 1;
+1 是必需的,因为索引从 0 开始。
我有一个作业要编写一个程序,将整数的数字和单词中的字母相加(每个字母的值由其在字母表中的位置给出,例如 j = 10)。经过一段时间试图找出一种方法来存储和检索每个字母的值后,我决定使用 HashMap ......但我想知道是否有更好的方法来做到这一点(我确定有)......所以我想得到一些关于如何改进代码和学习一些新东西的建议...谢谢!
import java.util.HashMap;
import java.util.Scanner;
public class NLS {
public static HashMap<Character, Integer> alphabet;
static {
alphabet = new HashMap<>();
alphabet.put('a', 1); alphabet.put('b', 2); alphabet.put('c', 3); alphabet.put('d', 4);
alphabet.put('e', 5); alphabet.put('f', 6); alphabet.put('g', 7); alphabet.put('h', 8);
alphabet.put('i', 9); alphabet.put('j', 10); alphabet.put('k', 11); alphabet.put('l', 12);
alphabet.put('m', 13); alphabet.put('n', 14); alphabet.put('ñ', 15); alphabet.put('o', 16);
alphabet.put('p', 17); alphabet.put('q', 18); alphabet.put('r', 19); alphabet.put('s', 20);
alphabet.put('t', 21); alphabet.put('u', 22); alphabet.put('v', 23); alphabet.put('w', 24);
alphabet.put('x', 25); alphabet.put('y', 26); alphabet.put('z', 27);
}
public static void main(String[] args) {
char keepGoing;
do {
int sum;
Scanner scan = new Scanner(System.in);
System.out.println("\n\n\n____________________________________________________________");
System.out.println("\n\tEnter a number [integer] or a word/sentence [no spaces]:\n");
String input = scan.nextLine();
boolean numeric = numberOrWord(input);
if (numeric) {
sum = digitSum(Integer.parseInt(input));
System.out.println("Result= " + sum);
} else {
char letter = calculateLetter(input);
System.out.println("Result= " + letter);
}
System.out.println("<<PRESS s/S TO CONTINUE>>");
keepGoing = scan.next().charAt(0);
} while (keepGoing == 's'||keepGoing == 'S');
}
public static boolean numberOrWord (String str){
try{
Double.parseDouble(str);
return true;
}catch(NumberFormatException e){
return false;
}
}
public static int digitSum(int number){
int sum = 0;
while(number > 0){
sum = sum + number % 10;
number /= 10;
}
return sum;
}
public static char calculateLetter(String word){
int sumPV = 0;
for(char digit : word.toCharArray()){
sumPV += alphabet.get(Character.toLowerCase(digit));
}
/* for(int i = 0, l = word.length(); i < l; i++){
char c = word.toLowerCase().charAt(i);
sumPV = sumPV + alphabet.get(c);
}*/
while(sumPV > 27){
sumPV =digitSum(sumPV);
}
char letter = (char) 0;
for(char key : alphabet.keySet()){
if(alphabet.get(key).equals(sumPV)) {
letter = key;
}
}
return letter;
}
}
每个字符都只是到整数值的映射,您可以打印它们的整数值以通过执行
等简单操作来查看 A -> 65char d = 'D'; // D is just 68
这样做
d - 65 Or d - 'A'
两者的结果都是 3
您可以使用 char 的整数值表示,并像这样进行整数运算
public class Main
{
public static void main(String[] args) {
System.out.println("Hello World");
char a = 'A';
System.out.println(a - 'A' + 1); //Returns 1
a = 'B';
System.out.println(a - 'A' + 1); //Returns 2
}
}
[更新] 对于您的具体情况,您只需要在替换之前将 ñ 替换为 O
您可以使用 Character.getNumericValue()。 这将为您提供该字母的 ASCII 代码。 由于该代码对于 'a' 不是 1,因此您需要通过例如
进行补偿int n = Caracter.getNumericValue(c) - Character.getNumericValue('a') + 1;
请注意,这仅在您只有小写字符时才有效。
另一种更接近您的代码的方法是简单地使用包含 'a' ... 'z' 的字符串并使用 indexOf(c).
String alphabet = "abcdefg...z";
int n = alphabet.indexOf("a") + 1;
+1 是必需的,因为索引从 0 开始。