学生信息管理案例

学生信息管理

核⼼考点:对象封装、List 定制排序、Set 去重(重写 equals/hashCode)、数据清洗 题⽬要求: 1. 封装 Student 类:学号(id,唯⼀标识)、姓名、年龄、成绩;

  1. 向 List 中添加学⽣数据(包含重复学号的⽆效数据);

  2. 对 List 做学号去重;

  3. 排序规则:成绩降序 → 成绩相同则年龄升序;

  4. 输出最终清洗后的学⽣列表。

打印结果:

================去重+排序后学⽣列表================

Student{id='S001', 姓名='张三', 年龄=20, 成绩=95.5}

Student{id='S003', 姓名='王五', 年龄=21, 成绩=95.5}

Student{id='S002', 姓名='李四', 年龄=19, 成绩=88.0}

案例分析

本案例运用 Java 面向对象思想与集合框架完成学生数据存储、去重与排序处理。首先定义学生实体类,封装学号、姓名、年龄、成绩四个私有成员属性,提供构造方法完成对象初始化,搭配 get 与 set 方法实现属性的访问与修改,同时重写 toString 方法,优化对象打印输出格式。

为实现集合对象精准去重,程序重写 equals 与 hashCode 方法,按照业务需求以学生学号作为唯一判断依据,学号一致即判定为重复学生信息,保障数据唯一性。

在主程序中,首先创建 ArrayList 集合存储多名学生对象,手动录入正常学生数据以及学号重复的冗余数据。利用 LinkedHashSet 集合元素不可重复的特性,将 List 集合数据转入 Set 集合完成自动去重,同时该集合可保留元素原有存入顺序,再转回 List 集合方便后续排序操作。

数据去重完成后,使用 List 集合自带排序方法结合 Lambda 表达式自定义排序规则,优先按照学生成绩进行降序排列,若两名学生成绩相同,则按照年龄进行升序排列,实现多级条件排序。

最后通过循环遍历集合,打印输出经过去重与排序处理后的最终学生数据。整体案例综合运用实体类封装、重写常用方法、List 与 Set 集合转换、自定义比较排序等知识点,完成杂乱学生数据的清洗整理,逻辑简洁实用,熟练掌握集合数据处理的常用开发思路。

知识点总结

  • 面向对象封装 定义学生实体类,将学号、姓名、年龄、成绩设置为私有成员变量,通过公共的 getter、setter 方法实现属性访问与修改,私有化数据提升代码安全性,符合 Java 封装特性。

  • 构造方法 自定义带参构造方法,快速完成学生对象的属性初始化,简化对象创建赋值流程。

  • 重写 Object 类常用方法 重写 toString 方法,自定义对象打印格式,直观展示学生全部信息;重写 equals 与 hashCode 方法,统一重复对象判断标准,本案例以学号为唯一依据判定对象是否重复,是 Set 集合实现对象去重的核心前提。

  • List 集合使用 运用 ArrayList 集合存储学生对象,该集合有序可重复,适合批量存入原始杂乱数据,支持灵活添加元素。

  • Set 集合去重原理 使用 LinkedHashSet 完成数据去重,该集合元素不可重复,同时保留元素存入顺序,依靠重写后的 equals 和 hashCode 方法识别重复学生对象,自动剔除学号重复数据。

  • 集合之间相互转换 实现 List 集合与 Set 集合互相转换,先借助 Set 完成去重,再转回 List 集合,满足后续排序操作的使用需求。

  • 集合自定义排序 使用 List 集合 sort 方法结合 Lambda 表达式实现自定义排序,设置多级排序规则,先按照成绩降序排序,成绩一致时按照年龄升序排序,掌握集合灵活排序的实现方式。

  • 增强 for 循环遍历 采用增强 for 循环遍历集合,简洁高效地遍历输出处理完成后的学生数据,简化集合遍历代码。

代码表示

复制代码
package com.sy.Task;

import java.util.*;

public class Student1 {
    private String id;
    private String name;
    private int age;
    private double score;
public Student1(String id,String name,int age,double score){
    this.id=id;
    this.name=name;
    this.age=age;
    this.score=score;
}

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student1 student1 = (Student1) o;
        return age == student1.age && Double.compare(score, student1.score) == 0 && Objects.equals(id, student1.id) && Objects.equals(name, student1.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, age, score);
    }

    @Override
    public String toString() {
        return "Student1{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }
}
 class Student {
    public static void main(String[] args) {
        // 2. 向List中添加包含重复学号的学生数据
        List<Student1> studentList = new ArrayList<>();
        studentList.add(new Student1("1", "张三", 20, 95.5));
        studentList.add(new Student1("2", "李四", 19, 88.0));
        studentList.add(new Student1("3", "王五", 21, 95.5));
        // 添加重复学号的无效数据
        studentList.add(new Student1("1", "张三", 22, 90.0));
        studentList.add(new Student1("2", "李四", 20, 85.0));
        // 3. 对List做学号去重(利用Set特性)
        Set<Student1> studentSet = new LinkedHashSet<>(studentList);
        List<Student1> uniqueList = new ArrayList<>(studentSet);
        // 4. 按规则排序:成绩降序 → 成绩相同则年龄升序
        uniqueList.sort((s1, s2) -> {
            // 先按成绩降序
            int scoreCompare = Double.compare(s2.getScore(), s1.getScore());
            if (scoreCompare != 0) {
                return scoreCompare;
            }
            // 成绩相同则按年龄升序
            return Integer.compare(s1.getAge(), s2.getAge());
        });
        // 5. 输出最终清洗后的学生列表
        for (Student1 student : uniqueList) {
            System.out.println(student);
        }
    }
}
相关推荐
爱棋笑谦1 小时前
单元测试简述
java
音符犹如代码2 小时前
Docker 一键部署带有 TimescaleDB 插件的 PostgreSQL
java·运维·数据库·后端·docker·postgresql·容器
sleepcattt2 小时前
Java反射技术
java
小锋java12342 小时前
【技术专题】Spring AI 2.0 - Advisors —— 拦截器模式增强AI能力
java·人工智能
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题 第56题】【JVM篇】第16题:JVM有哪些垃圾收集器?
java·开发语言·jvm·面试
二哈赛车手2 小时前
新人笔记---简易版AI实现以图搜图功能
java·人工智能·笔记·spring·ai
夕除2 小时前
spring boot 6
java·spring boot·后端
johnrui3 小时前
JUC之AQS
java·开发语言·jvm
Full Stack Developme3 小时前
Spring 模块介绍
java·后端·spring