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; }
二、单词按分值排序
计算完所有单词的分值后,可通过以下步骤实现排序:
- 将单词与对应分值存入
HashMap<String, Integer> - 把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
相关产品推荐
相关产品推荐

