You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建独立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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:42:21