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

Scrabble作业编程求助:字母分值分配及高效实现方案

Scrabble单词分值计算与排序优化方案

一、用单个变量管理字母分值(替代if-else)

推荐两种新手友好的方案,都能通过一个变量搞定所有字母到分值的映射:

方案1:HashMap(直观易理解)

用HashMap<Character, Integer>存储字母和对应分值,初始化时批量添加同分值的字母,逻辑清晰,新手容易上手:

// 单个HashMap变量管理所有字母分值
HashMap<Character, Integer> letterScores = new HashMap<>();

// 批量添加1分字母
for (char c : "AEIOULNSTR".toCharArray()) {
    letterScores.put(c, 1);
}
// 添加2分字母
letterScores.put('D', 2);
letterScores.put('G', 2);
// 按Scrabble规则补全剩余分值的字母(3分: B,C,M,P;4分: F,H,V,W,Y;5分: K;8分: J,X;10分: Q,Z)

// 计算单个单词的总分
public int calculateWordScore(String word) {
    int total = 0;
    // 统一转大写,避免大小写差异影响匹配
    String upperWord = word.toUpperCase();
    for (char c : upperWord.toCharArray()) {
        // 不存在的字符按0分处理,可根据作业要求调整
        total += letterScores.getOrDefault(c, 0);
    }
    return total;
}

方案2:字符数组(更高效)

利用英文字母ASCII值的连续性(A-Z对应65-90),创建长度为26的int数组,下标对应字母(c - 'A'),访问速度更快:

// 单个int数组变量管理所有分值,下标0对应A,1对应B...以此类推
int[] letterScores = new int[26];

// 初始化1分字母
for (char c : "AEIOULNSTR".toCharArray()) {
    letterScores[c - 'A'] = 1;
}
// 初始化2分字母
letterScores['D' - 'A'] = 2;
letterScores['G' - 'A'] = 2;
// 补全剩余分值的字母

// 计算单词总分
public int calculateWordScore(String word) {
    int total = 0;
    String upperWord = word.toUpperCase();
    for (char c : upperWord.toCharArray()) {
        // 过滤非字母字符,避免数组越界
        if (c >= 'A' && c <= 'Z') {
            total += letterScores[c - 'A'];
        }
    }
    return total;
}

二、单词按分值排序

计算完所有单词的分值后,可通过以下步骤实现排序:

  1. 将单词与对应分值存入HashMap<String, Integer>
  2. 把Map转成List,利用自定义Comparator实现排序(先按分值降序,分值相同按字母升序)

示例代码:

// 假设words是你已读取的单词列表
ArrayList<String> words = ...; // 你的单词ArrayList
HashMap<String, Integer> wordScoreMap = new HashMap<>();

// 批量计算所有单词的分值
for (String word : words) {
    wordScoreMap.put(word, calculateWordScore(word));
}

// 转成List进行排序
List<Map.Entry<String, Integer>> sortedWordList = new ArrayList<>(wordScoreMap.entrySet());
sortedWordList.sort((entry1, entry2) -> {
    // 先按分值降序
    int scoreCompare = entry2.getValue().compareTo(entry1.getValue());
    if (scoreCompare != 0) {
        return scoreCompare;
    }
    // 分值相同则按单词字母升序
    return entry1.getKey().compareTo(entry2.getKey());
});

// 打印排序结果
for (Map.Entry<String, Integer> entry : sortedWordList) {
    System.out.println(entry.getKey() + " : " + entry.getValue());
}

总结

这两种分值管理方案都用单个变量(HashMap或数组)替代繁琐的if-else,维护成本低——后续修改分值或新增字母只需调整初始化代码,无需改动判断逻辑。新手建议先从HashMap入手,逻辑更直观;熟悉后可切换到数组提升性能。

内容的提问来源于stack exchange,提问作者ScarletCas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 13:41:01