有没有更好的方法来存储和检索字母在字母表中的位置给定的值?

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 开始。