类Scrabble单词计分程序开发:Switch Case计分实现技术求助
嘿,看起来你已经迈出了不错的第一步——成功实现了字典文件的读取!咱们来一步步解决你的单词得分计算问题,先聊聊你关心的switch case方案,再修正代码里的问题。
关于Switch Case是否是最佳实现方式
首先明确:switch case完全可以实现字母到分值的映射,但它并不是最简洁易维护的方案。对于这种「字符-分值」的键值对场景,用HashMap<Character, Integer>会更直观,后续修改分值或调整字母分组也更方便。不过如果坚持用switch case,也是完全可行的,咱们先把你的写法修正到位。
你的代码里的核心问题
先梳理下你当前代码里的明显错误:
- 变量声明顺序混乱:你在打印时用到了
point,但之后才声明,还犯了int point = "";这种类型不匹配的低级错误 - Switch语法错误:case分支的写法完全不对,正确格式是
case 'a': return 1;,而且分值应该用整数而非字符串 - 缺少字母遍历逻辑:你需要逐个读取单词里的每个字母,累加每个字母的分值,而不是直接对整个单词处理
- 方法定义位置错误:
getScore()方法不能嵌套在main方法的循环内部
修正后的Switch Case实现
下面是修复后的完整代码,我会逐部分解释:
首先,写一个专门计算单个字母分值的方法,用switch实现:
private static int getLetterScore(char c) { // 统一转成小写,避免单词大小写不一致导致的分值错误 char lowerCaseChar = Character.toLowerCase(c); switch(lowerCaseChar) { // 1分字母:合并相同分值的case分支,简化代码 case 'a': case 'e': case 'i': case 'l': case 'n': case 'o': case 'r': case 's': case 't': case 'u': return 1; // 2分字母:你之前重复写了g,这里补上Scrabble里的d case 'g': case 'd': return 2; case 'b': case 'm': case 'c': case 'p': return 3; case 'f': case 'h': case 'v': case 'w': case 'y': return 4; case 'k': return 5; case 'j': case 'x': return 8; case 'q': case 'z': return 10; // 处理非字母字符(比如空格、符号),默认得分为0 default: return 0; } }
然后,写一个计算整个单词总分值的方法,遍历每个字母累加得分:
private static int getWordScore(String word) { int totalScore = 0; for (int i = 0; i < word.length(); i++) { char currentChar = word.charAt(i); totalScore += getLetterScore(currentChar); } return totalScore; }
最后修正main方法的逻辑,整合上面的方法:
import java.util.Scanner; import java.io.File; import java.io.FileNotFoundException; public class PointsProblem { public static void main(String[] args) throws FileNotFoundException { File file = new File("dictionary.txt"); // 检查文件是否存在 if (!file.exists()) { System.err.println("Cannot open file: " + file.getAbsolutePath()); System.exit(1); } System.out.println("Successfully opened file: " + file.getAbsolutePath() + "."); Scanner input = new Scanner(file); while (input.hasNextLine()) { String word = input.nextLine().trim(); // 去掉单词前后的空格 int score = getWordScore(word); System.out.println("'" + word + "' is worth " + score + " points"); } input.close(); // 记得关闭Scanner,避免资源泄漏 } // 上面的getLetterScore和getWordScore方法放在这里 private static int getLetterScore(char c) { // 实现代码同上 } private static int getWordScore(String word) { // 实现代码同上 } }
更简洁的HashMap替代方案
如果想让代码更易维护,推荐用HashMap来存储字母与分值的映射,后续调整规则只需修改映射表即可:
import java.util.HashMap; import java.util.Scanner; import java.io.File; import java.io.FileNotFoundException; public class PointsProblem { // 用静态HashMap存储分值映射,初始化一次即可 private static final HashMap<Character, Integer> LETTER_SCORES = new HashMap<>(); // 静态代码块初始化分值 static { // 批量添加同分值字母 for (char c : "aeilnorstu".toCharArray()) { LETTER_SCORES.put(c, 1); } for (char c : "gd".toCharArray()) { LETTER_SCORES.put(c, 2); } for (char c : "bcmp".toCharArray()) { LETTER_SCORES.put(c, 3); } for (char c : "fhvwy".toCharArray()) { LETTER_SCORES.put(c, 4); } LETTER_SCORES.put('k', 5); LETTER_SCORES.put('j', 8); LETTER_SCORES.put('x', 8); LETTER_SCORES.put('q', 10); LETTER_SCORES.put('z', 10); } private static int getWordScore(String word) { int totalScore = 0; // 转小写后遍历每个字母 for (char c : word.toLowerCase().toCharArray()) { // 字母不在映射表中则加0 totalScore += LETTER_SCORES.getOrDefault(c, 0); } return totalScore; } // main方法同上 public static void main(String[] args) throws FileNotFoundException { // 实现代码同上 } }
总结
- Switch case是可行的,但HashMap在「键值映射」场景下更简洁、易维护
- 你的核心问题是缺少字母遍历逻辑,以及代码里的语法/变量声明错误
- 无论用哪种方案,记得统一处理字母大小写,避免因单词大小写不一致导致的计算错误
内容的提问来源于stack exchange,提问作者Strato
相关产品推荐
相关产品推荐

