爱站网是干什么用的,代理广告投放平台,网站建设对企业的发展,wordpress产品详情相册前言 Java也可以有结构体吗#xff1f; 在 Java 中并没有直接的「结构体」概念#xff0c;但可以通过自定义类#xff08;class#xff09; 实现结构体的核心功能——封装一组具有关联关系的数据。本笔记通过实战题目#xff0c;讲解如何用自定义类存储复杂数据、处理业务…前言Java也可以有结构体吗在 Java 中并没有直接的「结构体」概念但可以通过自定义类class实现结构体的核心功能——封装一组具有关联关系的数据。本笔记通过实战题目讲解如何用自定义类存储复杂数据、处理业务逻辑后续可直接沿用该笔记格式补充更多同类题目。题目1歌唱比赛得分统计求最高平均分题目核心需求统计 n 名同学的歌唱比赛得分每位同学有 m 名评委打分得分规则为「去掉一个最高分、一个最低分后求平均值」最终输出所有同学中的最高平均分保留 2 位小数。解题思路封装数据模型定义Student类封装每位同学的评委分数数组、最高分、最低分、总分去高低分后、平均分。初始化数据创建 n 个Student实例每个实例初始化对应长度的评委分数数组。读取并计算数据逐行读取评委打分同时计算该同学的最高分、最低分、原始总分后续扣除高低分计算有效平均分。排序找最大值通过冒泡排序对所有同学的平均分进行升序排列排序后最后一个元素即为最高平均分。格式化输出保留 2 位小数输出结果。核心代码解析packageStruct;importjava.util.Scanner;// 封装学生歌唱比赛数据的类对应结构体功能classStudent{intid;// 可选学生编号本题未要求使用inta[];// 存储m名评委的打分intmax-1;// 最高分初始值低于最小可能得分0intmin11;// 最低分初始值高于最大可能得分10doubleavg;// 有效平均分去高低分后doublesum;// 原始总分所有评委打分之和}publicclassMain{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);intnsc.nextInt();// 学生人数intmsc.nextInt();// 评委人数Studentsts[]newStudent[n];// 学生数组存储所有学生信息// 步骤1初始化学生数组和每个学生的分数数组for(inti0;in;i){sts[i]newStudent();// 必须实例化每个Student否则会出现空指针异常sts[i].anewint[m];// 初始化每个学生的评委分数数组}// 步骤2读取打分并计算每个学生的核心数据max、min、sum、avgfor(inti0;in;i){for(intj0;jm;j){sts[i].a[j]sc.nextInt();// 读取单个评委打分sts[i].sumsts[i].a[j];// 累加原始总分// 更新最高分和最低分sts[i].maxMath.max(sts[i].a[j],sts[i].max);sts[i].minMath.min(sts[i].a[j],sts[i].min);}// 计算有效总分去掉最高分和最低分sts[i].sum-(sts[i].maxsts[i].min);// 计算有效平均分*1.0 确保除法结果为小数避免整数除法丢失精度sts[i].avgsts[i].sum*1.0/(m-2);}// 步骤3冒泡排序升序将平均分最低的放前面最高的放后面for(inti0;in-1;i){for(intj0;jn-1-i;j){if(sts[j].avgsts[j1].avg){// 交换两个学生对象整体交换无需单独交换每个字段体现类封装的优势Studenttempsts[j];sts[j]sts[j1];sts[j1]temp;}}}// 步骤4格式化输出最高平均分保留2位小数System.out.printf(%.2f\n,sts[n-1].avg);sc.close();}}关键注意点数组初始化Student sts[] new Student[n]仅创建了数组容器每个数组元素Student对象需要单独new Student()实例化否则会抛出NullPointerException。数据类型精度计算平均分时分母是m-2整数需要通过*1.0将分子转为浮点型避免整数除法直接舍弃小数部分导致结果错误。极值初始化最高分max初始化为-1低于最小可能得分 0最低分min初始化为11高于最大可能得分 10确保能被评委打分正确覆盖。输入输出示例输入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 名同学的姓名和语、数、英成绩找出所有「旗鼓相当的对手」组合每科成绩分差均不大于 5总分分差均不大于 10输出时满足字典序第一个姓名字典序 第二个姓名且组合整体按字典序排序。解题思路封装数据模型定义Student2类封装同学的姓名、三科成绩、总分。读取并存储数据读取 N 名同学的信息实例化Student2对象并存入数组输入已按字典序排列数组天然保留该顺序。双重循环匹配组合使用两层循环遍历所有i j的同学组合避免重复组合且保证i在前j在后符合字典序要求。判断对手条件逐一验证三科分差和总分分差的条件满足则输出对应姓名组合。保证输出格式因输入已按字典序排列i j的循环组合直接输出即可满足题目字典序要求。核心代码解析packageStruct;importjava.util.Scanner;// 封装学生期末考试数据的类对应结构体功能classStudent2{Stringname;// 学生姓名intchinese;// 语文成绩intmath;// 数学成绩intenglish;// 英语成绩intsum;// 三科总分}publicclassMain2{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);intnsc.nextInt();// 学生人数Student2sts[]newStudent2[n];// 学生数组存储所有学生信息// 步骤1读取并初始化所有学生的信息for(inti0;in;i){sts[i]newStudent2();// 实例化每个Student2对象避免空指针异常// 处理换行符问题nextInt()后未读取换行符next()会自动跳过空白字符包括换行、空格此处可省略sc.nextLine()sts[i].namesc.next();// 读取姓名无空格用next()sts[i].chinesesc.nextInt();// 读取语文成绩sts[i].mathsc.nextInt();// 读取数学成绩sts[i].englishsc.nextInt();// 读取英语成绩sts[i].sumsts[i].chinesests[i].mathsts[i].english;// 计算总分}// 步骤2双重循环匹配「旗鼓相当的对手」i j 避免重复组合且符合字典序for(inti0;in;i){for(intji1;jn;j){// 条件1每科成绩分差不大于5booleanchineseOkMath.abs(sts[i].chinese-sts[j].chinese)5;booleanmathOkMath.abs(sts[i].math-sts[j].math)5;booleanenglishOkMath.abs(sts[i].english-sts[j].english)5;// 条件2总分分差不大于10booleansumOkMath.abs(sts[i].sum-sts[j].sum)10;// 满足所有条件输出组合if(chineseOkmathOkenglishOksumOk){System.out.println(sts[i].name sts[j].name);}}}sc.close();}}关键注意点避免重复组合使用i j的循环逻辑外层i从 0 到 n-1内层j从i1到 n-1既不会出现i,i自身组合也不会出现j,i与i,j重复的组合。字典序保证题目明确输入姓名按字典序排列数组存储顺序与输入顺序一致i j对应的sts[i].name字典序必然小于sts[j].name直接输出即可满足题目要求。输入读取技巧读取姓名使用sc.next()适用于无空格的字符串nextInt()和next()会自动跳过空白字符换行、空格无需额外处理换行符问题原代码中的if(i0) sc.nextLine()是冗余的可删除。分差计算使用Math.abs()计算绝对值差避免分差为负数导致判断条件错误。输入输出示例输入3 fafa 90 90 90 lxl 95 85 90 senpai 100 80 91输出fafa lxl lxl senpai