跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

Java结构体实战:歌唱比赛评分与旗鼓相当对手匹配

综述由AI生成展示了如何在Java中通过自定义类模拟结构体的功能,解决两类典型问题:一是根据评委评分规则计算学生最高平均分,二是筛选出满足特定条件的旗鼓相当的学生组合。通过这两个例子详细说明了Java类的设计方法、数据处理流程以及常见注意事项。

GRACE Grace发布于 2026/2/15更新于 2026/5/2823 浏览

前言

Java虽然没有直接的结构体概念,但可以通过自定义类实现类似功能,用于封装一组相关联的数据。本笔记通过两个实际编程题目展示如何使用Java类模拟结构体,并完成相应的业务逻辑处理。

题目1:歌唱比赛得分统计(求最高平均分)

题目核心需求

统计n名同学的歌唱比赛得分,每位同学由m名评委打分。得分规则为'去掉一个最高分、一个最低分后求平均值',最终输出所有同学中的最高平均分(保留两位小数)。

解题思路
  1. 定义Student类来封装每位学生的评委分数数组、最高分、最低分、总分及平均分。
  2. 创建n个Student实例并初始化其分数数组。
  3. 读取评委打分的同时计算每个学生的最高分、最低分和原始总分,然后扣除极值后计算有效平均分。
  4. 使用冒泡排序对学生平均分进行升序排列,最后一个元素即为所求最高平均分。
  5. 格式化输出结果。
核心代码解析
import java.util.Scanner;

class Student {
    int[] a; // 存储m名评委的打分
    int max = -1; // 最高分,初始值低于最小可能得分(0)
    int min = 11; // 最低分,初始值高于最大可能得分(10)
    double avg;   // 有效平均分(去高低分后)
    double sum;   // 原始总分
}

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(); // 学生人数
        int m  sc.nextInt(); 
        Student[] sts =  [n]; 

        
         (   ; i < n; i++) {
            sts[i] =  ();
            sts[i].a =  [m];
        }

        
         (   ; i < n; i++) {
             (   ; j < m; j++) {
                sts[i].a[j] = sc.nextInt();
                sts[i].sum += sts[i].a[j];
                sts[i].max = Math.max(sts[i].a[j], sts[i].max);
                sts[i].min = Math.min(sts[i].a[j], sts[i].min);
            }
            sts[i].sum -= (sts[i].max + sts[i].min);
            sts[i].avg = sts[i].sum *  / (m - );
        }

        
         (   ; i < n - ; i++) {
             (   ; j < n -  - i; j++) {
                 (sts[j].avg > sts[j + ].avg) {
                       sts[j];
                    sts[j] = sts[j + ];
                    sts[j + ] = temp;
                }
            }
        }

        
        System.out.printf(, sts[n - ].avg);
        sc.close();
    }
}
=
// 评委人数
new
Student
// 学生数组
// 步骤1:初始化学生数组和每个学生的分数数组
for
int
i
=
0
new
Student
new
int
// 步骤2:读取打分并计算每个学生的核心数据
for
int
i
=
0
for
int
j
=
0
1.0
2
// 步骤3:冒泡排序(升序)
for
int
i
=
0
1
for
int
j
=
0
1
if
1
Student
temp
=
1
1
// 步骤4:格式化输出最高平均分
"%.2f\n"
1
关键注意点
  • 数组初始化:必须为每个Student对象分配内存空间,防止空指针异常。
  • 数据类型精度:使用*1.0将整数转换为浮点数以避免整数除法误差。
  • 极值初始化:合理设置初始值确保能正确更新最大值和最小值。
输入输出示例

输入:

7 6 
4 7 2 6 10 7 
0 5 0 10 3 10 
2 6 8 4 3 6 
6 3 6 7 5 8 
5 9 3 3 8 1 
5 9 9 3 2 0 
5 8 0 4 1 10

输出:

6.00

题目2:期末考试「旗鼓相当的对手」匹配

题目核心需求

给定N名同学的姓名和语、数、英成绩,找出所有满足以下条件的「旗鼓相当的对手」组合:

  1. 每科成绩分差均不大于5;
  2. 总分分差不大于10;
  3. 组合需按照字典序输出。
解题思路
  1. 定义Student2类封装学生姓名、各科成绩和总分。
  2. 读取N名学生信息并存储到数组中。
  3. 使用双重循环遍历所有i < j的学生组合,检查是否符合条件。
  4. 若满足条件,则输出对应的姓名组合。
核心代码解析
import java.util.Scanner;

class Student2 {
    String name;
    int chinese;
    int math;
    int english;
    int sum;
}

public class Main2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(); // 学生人数
        Student2[] sts = new Student2[n];

        // 步骤1:读取并初始化所有学生的信息
        for (int i = 0; i < n; i++) {
            sts[i] = new Student2();
            sts[i].name = sc.next();
            sts[i].chinese = sc.nextInt();
            sts[i].math = sc.nextInt();
            sts[i].english = sc.nextInt();
            sts[i].sum = sts[i].chinese + sts[i].math + sts[i].english;
        }

        // 步骤2:双重循环匹配「旗鼓相当的对手」
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                boolean chineseOk = Math.abs(sts[i].chinese - sts[j].chinese) <= 5;
                boolean mathOk = Math.abs(sts[i].math - sts[j].math) <= 5;
                boolean englishOk = Math.abs(sts[i].english - sts[j].english) <= 5;
                boolean sumOk = Math.abs(sts[i].sum - sts[j].sum) <= 10;

                if (chineseOk && mathOk && englishOk && sumOk) {
                    System.out.println(sts[i].name + " " + sts[j].name);
                }
            }
        }
        sc.close();
    }
}
关键注意点
  • 避免重复组合:采用i < j的方式遍历,自然排除重复和自身比较的情况。
  • 字典序保证:由于输入已按字典序排列,因此直接输出即可满足题目要求。
  • 分差计算:利用Math.abs()函数获取绝对值差,简化判断逻辑。
输入输出示例

输入:

3
fafa 90 90 90
lxl 95 85 90
senpai 100 80 91

输出:

fafa lxl
lxl senpai

目录

  1. 前言
  2. 题目1:歌唱比赛得分统计(求最高平均分)
  3. 题目核心需求
  4. 解题思路
  5. 核心代码解析
  6. 关键注意点
  7. 输入输出示例
  8. 题目2:期末考试「旗鼓相当的对手」匹配
  9. 题目核心需求
  10. 解题思路
  11. 核心代码解析
  12. 关键注意点
  13. 输入输出示例
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 【大模型 】API 对接指南:OpenAI/Claude/LLaMA 3 调用技巧
  • 2026年最新全球AI大模型深度研究报告
  • (5)ModalAI VOXL2
  • C++ Qt 窗口框架与菜单栏 QMenuBar 使用指南
  • 基于 PySide6 和 VTK 的 STL 文件曲面选择器与导出工具
  • VS Code Copilot 完整使用教程
  • 基于 FPGA 的图像形态学腐蚀处理 Verilog 开发与硬件测试
  • 大模型行业三大核心竞争力:资金、人才与数据
  • C++ 哈希桶链地址法实现
  • ToDesk、顺网云与海马云部署 DeepSeek 对比评测
  • C++ 智能指针:使用场景、实现原理与内存泄漏防治
  • Xilinx FPGA 开发:Vivado 与 Vitis 流程解析
  • SpringDoc 基本使用指南
  • 双指针算法实战:移动零、复写零与快乐数
  • Java AI 辅助在线图书借阅平台开发实践指南
  • Xilinx FPGA 实现 RISC-V 五级流水线 CPU 设计实战
  • Layui 框架下 Unity WebGL Tab 切换黑屏解决方案
  • SQL Server 安装及使用教程(含远程连接配置)
  • Python 实现中秋月相计算、月饼切分与可视化
  • Linux 网络基础:局域网通信与跨网段传输详解

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online