You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:16:13