使用Comparator对ArrayList按单词得分降序排序的实现疑问
拼字游戏单词按得分排序实现方案
两种可行思路,按需选择
1. 直接基于原单词列表排序(无需新建集合)
如果你的单词得分计算逻辑不复杂、耗时低,可以直接在排序时实时计算得分,用lambda表达式实现Comparator。这样不用额外创建关联集合,代码更简洁:
首先确保你有一个计算单个单词得分的方法(比如calculateScore),然后直接调用列表的sort方法:
// 示例计算得分的方法(你可以替换成自己已实现的逻辑) private static int calculateScore(String word) { int[] charScores = {1,3,3,2,1,4,2,4,1,8,5,1,3,1,1,3,10,1,1,1,1,4,4,8,4,10}; int sum = 0; for (char c : word.toUpperCase().toCharArray()) { sum += charScores[c - 'A']; } return sum; } // 排序原单词列表(从高到低) ArrayList<String> words = new ArrayList<>(Arrays.asList("apple", "orange", "grape")); words.sort((word1, word2) -> Integer.compare(calculateScore(word2), calculateScore(word1))); // 验证排序结果 for (String word : words) { System.out.println(word + " 得分:" + calculateScore(word)); }
这里lambda表达式里用calculateScore(word2)在前,word1在后,实现降序排序;如果要升序,反过来即可。
2. 新建关联单词与得分的集合(适合复杂计算场景)
如果得分计算逻辑复杂、重复计算会影响性能,或者后续需要频繁同时使用单词和得分,建议创建一个自定义类来封装两者,再对这个类的集合排序:
// 自定义类,存储单词和对应的得分 class ScrabbleWord { private String word; private int score; public ScrabbleWord(String word, int score) { this.word = word; this.score = score; } // 提供getter方法用于排序和取值 public String getWord() { return word; } public int getScore() { return score; } } // 转换原单词列表为ScrabbleWord集合 ArrayList<String> originalWords = new ArrayList<>(Arrays.asList("apple", "orange", "grape")); ArrayList<ScrabbleWord> scrabbleWords = new ArrayList<>(); for (String word : originalWords) { scrabbleWords.add(new ScrabbleWord(word, calculateScore(word))); } // 按得分降序排序 scrabbleWords.sort((sw1, sw2) -> Integer.compare(sw2.getScore(), sw1.getScore())); // 遍历输出 for (ScrabbleWord sw : scrabbleWords) { System.out.println("单词:" + sw.getWord() + ",得分:" + sw.getScore()); }
这种方式只需要计算一次得分,后续排序和操作都直接用已存的score值,性能更优。
内容的提问来源于stack exchange,提问作者ScarletCas
相关产品推荐
相关产品推荐

