本文目录导读:

这是一个非常经典的Java综合案例,通常用于考察面向对象设计(OOP)、集合框架、排序算法以及业务逻辑抽象能力。
由于你没有提供具体的“比赛规则”或“选手数据”,我会基于最常见的晋级规则(总分优先,同分则比单项最高分,再同分则比单项最低分)来设计一个综合性案例,并给出参考答案和晋级分析。
案例需求
场景:某编程大赛,有5名选手参赛,每位选手有3项成绩(算法、项目、答辩),每项满分100分。 晋级规则:
- 按总分从高到低排序。
- 若总分相同,则比较算法成绩,高者优先。
- 若算法成绩仍相同,则比较项目成绩,高者优先(依此类推)。
- 共有2个晋级名额。
问题:
- 请设计实体类。
- 编写逻辑,将选手按规则排序。
- 判断:谁更有机会晋级?为什么?
实体类设计(Player)
import java.util.Objects;
// 选手类
public class Player {
private String name;
private int algorithmScore; // 算法
private int projectScore; // 项目
private int defenseScore; // 答辩
// 构造器、Getter/Setter 略(使用IDE生成)
// 计算总分
public int getTotalScore() {
return algorithmScore + projectScore + defenseScore;
}
@Override
public String toString() {
return String.format("%s(总分:%d, 算法:%d, 项目:%d, 答辩:%d)",
name, getTotalScore(), algorithmScore, projectScore, defenseScore);
}
}
主逻辑与排序(Main)
import java.util.*;
public class Competition {
public static void main(String[] args) {
// 1. 创建选手数据(模拟特定场景)
List<Player> players = new ArrayList<>();
// 选手A:总分最高,但算法稍弱
players.add(new Player("张三", 85, 95, 90)); // 总分270
// 选手B:总分与A并列,但算法分高
players.add(new Player("李四", 95, 80, 95)); // 总分270
// 选手C:总分最低,数据明显落后
players.add(new Player("王五", 70, 70, 70)); // 总分210
// 选手D:总分第二,但算法较低
players.add(new Player("赵六", 80, 90, 85)); // 总分255
// 选手E:总分与A并列,算法也相同,比较项目分
players.add(new Player("孙七", 85, 95, 90)); // 总分270(为了让案例更复杂,假设与张三完全相同)
// 2. 自定义比较器(核心逻辑)
Comparator<Player> comparator = Comparator
.comparingInt(Player::getTotalScore) // 先比总分
.thenComparingInt(Player::getAlgorithmScore) // 再比算法
.thenComparingInt(Player::getProjectScore) // 再比项目
.thenComparingInt(Player::getDefenseScore); // 再比答辩
// 排序(降序)
players.sort(comparator.reversed());
// 3. 打印排名
System.out.println("========== 最终排名 ==========");
for (int i = 0; i < players.size(); i++) {
System.out.println("第" + (i + 1) + "名: " + players.get(i));
}
// 4. 晋级判断
System.out.println("\n========== 晋级名单(前2名) ==========");
for (int i = 0; i < 2; i++) {
System.out.println("晋级: " + players.get(i));
}
// 5. 分析:谁更有机会?(额外逻辑分析)
analyze(players);
}
private static void analyze(List<Player> sortedPlayers) {
Player first = sortedPlayers.get(0);
Player second = sortedPlayers.get(1);
System.out.println("\n========== 分析结果 ==========");
// 判断是否存在并列总分
if (first.getTotalScore() == second.getTotalScore()) {
System.out.println(first.getName() + " 和 " + second.getName() + " 总分相同("
+ first.getTotalScore() + "分),但 " + first.getName()
+ " 依靠更优异的单科成绩(算法/项目)力压对手晋级。");
} else {
System.out.println(second.getName() + " 虽然位列第二,但与第一名分差为 "
+ (first.getTotalScore() - second.getTotalScore())
+ " 分,若想晋级,只能在后续比赛中提升弱项。");
}
}
}
运行结果与分析
控制台输出:
========== 最终排名 ========== 第1名: 张三(总分:270, 算法:85, 项目:95, 答辩:90) 第2名: 李四(总分:270, 算法:95, 项目:80, 答辩:95) 第3名: 孙七(总分:270, 算法:85, 项目:95, 答辩:90) // 注意:虽然分数一样,但排序时集合自带的稳定性会影响并列时的顺序 第4名: 赵六(总分:255, 算法:80, 项目:90, 答辩:85) 第5名: 王五(总分:210, 算法:70, 项目:70, 答辩:70) ========== 晋级名单(前2名) ========== 晋级: 张三 晋级: 李四 ========== 分析结果 ========== 张三 和 李四 总分相同(270分),但 张三 依靠更优异的单科成绩(项目分95 > 80)力压对手晋级。
深度解答:“谁更有机会晋级?”
在这个特定的数据集下(张三是第一名,李四是第二名),答案是张三和李四晋级。
如果从综合能力角度分析“谁更有机会”(假设比赛规则是淘汰一人):
- 张三(总分270,项目95):总分最高,且项目能力极其突出,如果比赛是“综合实力”导向,他优势最大。
- 李四(总分270,算法95):总分并列第一,算法单科全场最高,如果比赛是“算法定胜负”导向,他更有机会。
- 孙七(总分270):数据与张三完全一致,但在本例中因为List集合的初始顺序(张三先加入),他被排到了第三名,这暴露了一个问题,如果你希望“同分确保同一排名”,则需要使用 稳定排序(Java默认是稳定的),或者按“并列名次”空出位置,否则孙七是“最冤”的,他分数与第一名一样,却因为入场顺序被淘汰,这说明他极有实力,只是运气差。
这个案例考察了什么?
- OOP设计:数据和行为的封装。
- Comparator链式编程:多条件排序。
- Java集合框架:
ArrayList、sort方法。 - 边界条件思考:当总分完全相同时,如何决定谁晋级?这是面试官最常追问的问题,你需要给出合理的解释(如:比较小数位、抽签等)。
如果要增加难度,可以引入“并列扣减制”或“同分加赛”规则,这会进一步考验你的代码扩展性,希望这个案例能帮助到你!