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

Java 有没有更好的方法来存储和检索字母在字母表中的位置给出的字母值?,java,algorithm,hashmap,Java,Algorithm,Hashmap,我有一个任务要写一个程序,将整数的数字和单词中的字母相加(每个字母的值由其在字母表中的位置给出,例如j=10)。在尝试找出存储和检索每个字母值的方法一段时间后,我决定使用HashMap。。。但我想知道是否有更好的方法(我肯定有)。。。所以我想得到一些关于如何改进代码和学习一些新东西的建议。。。谢谢 import java.util.HashMap; import java.util.Scanner; public class NLS { public static HashMap&l

我有一个任务要写一个程序,将整数的数字和单词中的字母相加(每个字母的值由其在字母表中的位置给出,例如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;
    }

}



import java.util.HashMap;
导入java.util.Scanner;
公共类免入息审查{
公共静态HashMap字母表;
静止的{
字母表=新的HashMap();
字母表.put('a',1);字母表.put('b',2);字母表.put('c',3);字母表.put('d',4);
字母表。put('e',5);字母表。put('f',6);字母表。put('g',7);字母表。put('h',8);
字母表.put('i',9);字母表.put('j',10);字母表.put('k',11);字母表.put('l',12);
字母表。put('m',13);字母表。put('n',14);字母表。put('ñ',15);字母表。put('o',16);
字母表。put('p',17);字母表。put('q',18);字母表。put('r',19);字母表。put('s',20);
字母表。put('t',21);字母表。put('u',22);字母表。put('v',23);字母表。put('w',24);
字母表。put('x',25);字母表。put('y',26);字母表。put('z',27);
}
公共静态void main(字符串[]args){
炭保持;
做{
整数和;
扫描仪扫描=新扫描仪(System.in);
系统.out.println(“\n\n\n\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
System.out.println(“\n\t输入数字[整数]或单词/句子[无空格]:\n”);
字符串输入=scan.nextLine();
布尔数字=数字字(输入);
如果(数字){
sum=digitSum(整数.parseInt(输入));
System.out.println(“结果=”+sum);
}否则{
字符字母=计算器(输入);
System.out.println(“结果=”+字母);
}
System.out.println(“”);
keepGoing=scan.next().charAt(0);
}而(keepGoing=='s'| | keepGoing=='s');
}
公共静态布尔numberroword(String str){
试一试{
Double.parseDouble(str);
返回true;
}捕获(数字格式){
返回false;
}
}
公共静态整数数字(整数编号){
整数和=0;
而(数量>0){
总和=总和+数字%10;
数目/=10;
}
回报金额;
}
公共静态字符计算器(字符串字){
int-sumPV=0;
for(字符位数:word.toCharArray()){
sumPV+=alphabet.get(Character.toLowerCase(digital));
}
/*for(int i=0,l=word.length();i27){
sumPV=数字(sumPV);
}
字符字母=(字符)0;
for(字符键:alphabet.keySet()){
if(字母表get(键).equals(sumPV)){
字母=键;
}
}
回信;
}
}

每个字符只是一个到整数值的映射,您可以通过执行以下简单操作打印它们的intger值以查看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)


+1是必需的,因为索引以0开头。

这根本不是
getNumericValue
所做的。这实际上是可行的,但不是因为给出的原因。它也适用于大写字母。为什么不呢?根据javadoc,getNumericValue()返回字符的unicode值。由于高达255的unicode值相当于ASCII编码,因此我的代码工作得非常好。您是否阅读了链接到的javadoc?它清楚地表明getNumericValue不会返回字符的Unicode值@Ridcully@DawoodIbnKareem你是对的!我只读了第一段,应该读得更进一步。字母未映射到ASCII代码。我的示例之所以有效,是因为代码是从a到z的asxending,但正如您所说的,这更多是出于运气。您不需要像这样存储值。你可以很容易地计算它们。对于字母,小写字母的值等于
c-'a'+1
<对于大写字母,代码>c-“A”+1。
String alphabet = "abcdefg...z";
int n = alphabet.indexOf("a") + 1;