如何创建独立Java类实现世界杯16强回合的字符输入触发?
解决方案
1. 重构现有类,拆分职责
现有代码存在语义模糊、逻辑冗余的问题:Teams类命名不准确,Main类承担了过多初始化和展示工作。我们需要拆分出专门的类来封装小组数据、处理赛事流程与用户交互。
第一步:创建Group类(替代原Teams类)
专注封装单个小组的球队数据与对阵展示,语义更清晰:
import java.util.ArrayList; import java.util.List; public class Group { private final String groupName; private final List<String> teams; public Group(String groupName) { this.groupName = groupName; this.teams = new ArrayList<>(); } public void addTeam(String team) { teams.add(team); } public String getGroupName() { return groupName; } public List<String> getTeams() { return teams; } // 打印小组内的对阵安排 public void printGroupMatches() { System.out.println(getGroupName() + ":"); System.out.println(teams.get(3) + " vs. " + teams.get(0)); System.out.println(teams.get(2) + " vs. " + teams.get(1)); System.out.println("///////////////////////////////////////////"); } }
第二步:创建WorldCupTournament类(核心功能类)
负责初始化所有小组、处理用户输入触发各轮比赛,完全独立于Main类:
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class WorldCupTournament { private final List<Group> groups; private final Scanner scanner; public WorldCupTournament() { groups = new ArrayList<>(); scanner = new Scanner(System.in); initializeGroups(); } // 初始化所有小组数据 private void initializeGroups() { Group groupA = new Group("Group A"); groupA.addTeam("Argentina"); groupA.addTeam("Portugal"); groupA.addTeam("England"); groupA.addTeam("Germany"); Group groupB = new Group("Group B"); groupB.addTeam("United States"); groupB.addTeam("France"); groupB.addTeam("Spain"); groupB.addTeam("Japan"); Group groupC = new Group("Group C"); groupC.addTeam("Canada"); groupC.addTeam("Mexico"); groupC.addTeam("Poland"); groupC.addTeam("South Korea"); Group groupD = new Group("Group D"); groupD.addTeam("Uruguay"); groupD.addTeam("Wales"); groupD.addTeam("Switzerland"); groupD.addTeam("Croatia"); groups.add(groupA); groups.add(groupB); groups.add(groupC); groups.add(groupD); } // 启动赛事,接收char类型输入触发轮次 public void startTournament() { System.out.println("Welcome to the FIFA 2023 World Cup"); System.out.println("Enter 's' to start group stage matches, 'q' to quit:"); while (true) { char input = scanner.next().charAt(0); switch (input) { case 's': playGroupStage(); System.out.println("\nEnter 'r' to start round of 16, 'q' to quit:"); break; case 'r': playRoundOf16(); System.out.println("\nTournament ended. Enter 'q' to exit."); break; case 'q': System.out.println("Exiting tournament..."); scanner.close(); return; default: System.out.println("Invalid input! Enter 's', 'r' or 'q':"); } } } // 执行小组赛阶段 private void playGroupStage() { System.out.println("\n--- Group Stage Matches ---"); for (Group group : groups) { group.printGroupMatches(); } } // 执行16强赛阶段(示例用固定晋级球队,可根据实际逻辑扩展) private void playRoundOf16() { System.out.println("\n--- Round of 16 Matches ---"); String[][] roundOf16Matches = { {"Germany", "United States"}, {"England", "Japan"}, {"Argentina", "Spain"}, {"Portugal", "France"}, {"South Korea", "Uruguay"}, {"Poland", "Croatia"}, {"Canada", "Switzerland"}, {"Mexico", "Wales"} }; for (String[] match : roundOf16Matches) { System.out.println(match[0] + " vs. " + match[1]); } System.out.println("///////////////////////////////////////////"); } }
第三步:简化Main类
Main类仅负责启动赛事,不处理任何业务逻辑:
public class WorldCupMain { public static void main(String[] args) { WorldCupTournament tournament = new WorldCupTournament(); tournament.startTournament(); } }
2. 关键改进点说明
- 职责单一:
Group管理小组数据与展示,WorldCupTournament处理赛事流程与用户交互,Main仅做启动入口,符合面向对象设计原则。 - 消除冗余:原Main类中重复的小组初始化、打印逻辑被封装,代码复用性提升。
- 符合需求:通过char类型输入触发不同轮次,所有核心逻辑集中在独立类中,便于后续维护扩展。
- 可扩展性:新增8强、半决赛等轮次时,只需在
WorldCupTournament中添加对应方法,无需修改Main类。
内容的提问来源于stack exchange,提问作者White
相关产品推荐
相关产品推荐

