Java应用中玩家胜场排名功能实现问题求助
一、PlayerResults类的错误
1. compareTo方法参数类型不匹配
类实现的是Comparable<PlayerResults>,但compareTo方法的参数却是PickemResults,需改为PlayerResults类型。
2. int类型无法调用compareTo方法
wins是int基本数据类型,不能直接调用compareTo方法,需用Integer.compare完成数值比较。修改后的方法如下:
@Override public int compareTo(PlayerResults another) { return Integer.compare(this.wins, another.wins); }
注:你后续排序时使用了reverseOrder(),这个升序的compareTo配合反向排序,就能实现按胜场从高到低排列,逻辑是通顺的。
二、standardRanking方法的错误
1. 核心排名逻辑完全错误
原代码中i == playerList.get(group).getPlayerWins()的判断逻辑不成立——i是循环索引(0、1、2...),getPlayerWins()返回的是胜场数值(如44、42),二者没有关联,导致rank无法被正确更新。
2. printf格式化字符串参数不匹配
原代码中printf("%d %s%n", rank, playerList.get(i).getPlayerWins(), playerList.get(i).getPlayerUsername());存在参数数量不匹配问题:%d %s仅对应两个参数,但实际传入了三个(rank、胜场数、用户名),需改为%d %d %s%n。
修复后的standardRanking方法
正确逻辑是跟踪当前胜场数,遇到不同胜场时更新排名,并列玩家使用相同排名:
public static void standardRanking(List<PlayerResults> playerList) { if (playerList.isEmpty()) { return; } int rank = 1; int previousWins = playerList.get(0).getPlayerWins(); // 处理第一个玩家 System.out.printf("%d %d %s%n", rank, playerList.get(0).getPlayerWins(), playerList.get(0).getUserName()); for (int i = 1; i < playerList.size(); i++) { PlayerResults current = playerList.get(i); if (current.getPlayerWins() != previousWins) { // 排名更新为当前索引+1(索引从0开始) rank = i + 1; previousWins = current.getPlayerWins(); } System.out.printf("%d %d %s%n", rank, current.getPlayerWins(), current.getUserName()); } }
三、排序逻辑验证
你的排序代码playerList.sort(Comparator.comparing(PlayerResults::getPlayerWins, Comparator.reverseOrder()));是正确的,能实现玩家按胜场从高到低排列,配合修复后的排名方法即可得到预期输出:
1 44 Solomon 2 42 Jason 2 42 Errol 4 41 Garry 4 41 Bernard 4 41 Barry 7 39 Stephen
内容的提问来源于stack exchange,提问作者Learn2Code

