Redis版学生管理系统(java)

【问题简述】:

要求用Redis完成以下功能,根据功能使用合适的数据结构:

(1)add(Stu), 增加学生时给个独一无二的id,username、phone手机号、java成绩、math成绩可以随意赋个合适值(不要从控制台输入),username有可能重名的情况,增加时无需特殊处理。phone必须保证唯一,如果不唯一,给出错误信息

(2) findByUsername(String),按照姓名查询,考虑查询到和查询不到,也要考虑重名情况,有多少个显示多少个。显示查询到学生信息。

(3)sortAvg(),用sorted set实现按平均成绩降序排序,并分页,分页大小为2,每页显示两个学生信息。

(4)sortAvgBySoringParam(int page),用SortingParams实现按平均成绩降序排序

【代码示例】:
package org.example;
public class Student {
    private String username;
    private String phone;
    private int javaScore;
    private int mathScore;
    private long id;
    private double averageScore;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public int getJavaScore() {
        return javaScore;
    }
    public void setJavaScore(int javaScore) {
        this.javaScore = javaScore;
    }
    public int getMathScore() {
        return mathScore;
    }
    public void setMathScore(int mathScore) {
        this.mathScore = mathScore;
    }
    public long getId(){
        return id;
    }
    public void setId(long id) {
        this.id=id;
    }
    public void setAvgScore(double averageScore) {
        this.averageScore=averageScore;
    }
    public double getAvgScore(){
        return averageScore;
    }
    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", phone='" + phone + '\'' +
                ", javaScore=" + javaScore +
                ", mathScore=" + mathScore +
                ", averageScore=" + averageScore +
                '}';
    }
}
package org.example;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Tuple;
import java.util.*;
public class StudentManager {
    private static Jedis jedis;
    private static final String stuPrefix = "student:";
    private static final String phoneKey = "phone_set";
    public StudentManager() {
        jedis = new Jedis("localhost");
    }
    // (1)增加
    public void add(Student stu) {
        long studentId = jedis.incr("student_id_counter");
        String studentKey = stuPrefix + studentId;
        String phone = stu.getPhone();
        if (jedis.sismember(phoneKey, phone)) {
            //throw new IllegalArgumentException("PhoneNumber already exists.");
            System.out.println("电话号码已经存在,增加学生失败。");
            System.out.println();
        }
        else{
            System.out.println("添加成功!");
        }
        jedis.hset(studentKey, "username", stu.getUsername());
        jedis.hset(studentKey, "phone", phone);
        jedis.hset(studentKey, "java", Integer.toString(stu.getJavaScore()));
        jedis.hset(studentKey, "math", Integer.toString(stu.getMathScore()));
        jedis.sadd(phoneKey, phone);
    }
    //(2)
    public List<Student> findByUsername(String username) {
        List<Student> result = new ArrayList<>();

        Set<String> studentKeys = jedis.keys(stuPrefix + "*");

        for (String key : studentKeys) {
            String storedUsername = jedis.hget(key, "username");

            if (storedUsername.equals(username)) {
                Map<String, String> studentData = jedis.hgetAll(key);
                Student student = new Student();
                student.setId(Long.parseLong(key.split(":")[1]));
                student.setUsername(studentData.get("username"));
                student.setPhone(studentData.get("phone"));
                student.setJavaScore(Integer.parseInt(studentData.get("java")));
                student.setMathScore(Integer.parseInt(studentData.get("math")));
                result.add(student);
            }
        }
        return result;
    }
    //(3)
    public List<Student> sortAvg() {
        List<Student> result = new ArrayList<>();

        Set<String> studentIds = jedis.zrevrangeByScore("students_average_score", "+inf", "-inf");

        for (String studentId : studentIds) {
            String studentKey = stuPrefix + studentId;
            Map<String, String> studentData = jedis.hgetAll(studentKey);

            Student student = new Student();
            student.setId(Long.parseLong(studentId));
            student.setUsername(studentData.get("username"));
            student.setPhone(studentData.get("phone"));
            student.setJavaScore(Integer.parseInt(studentData.get("java")));
            student.setMathScore(Integer.parseInt(studentData.get("math")));

            int javaScore = student.getJavaScore();
            int mathScore = student.getMathScore();
            double avgScore = (javaScore + mathScore) / 2.0;
            student.setAvgScore(avgScore);
            result.add(student);
        }
        return result;
    }
    //(4)
    public static List<Student> sortAvgBySortingParam(int page) {
        List<Student> result = new ArrayList<>();

        try (Jedis jedis = new Jedis("localhost")) {
            int pageSize = 2;
            int start = (page - 1) * pageSize;
            int end = start + pageSize - 1;

            Set<Tuple> sortedStudents = jedis.zrevrangeWithScores("students_average_score", start, end);

            for (Tuple sortedStudent : sortedStudents) {
                String studentId = sortedStudent.getElement();
                String username = jedis.hget("student:" + studentId, "username");
                String phone = jedis.hget("student:" + studentId, "phone");
                String javaScore = jedis.hget("student:" + studentId, "java");
                String mathScore = jedis.hget("student:" + studentId, "math");

                Student student = new Student();
                student.setId(Long.parseLong(studentId));
                student.setUsername(username);
                student.setPhone(phone);
                student.setJavaScore(Integer.parseInt(javaScore));
                student.setMathScore(Integer.parseInt(mathScore));
                result.add(student);
            }
        }
        return result;
    }
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        StudentManager StuMan=new StudentManager();
        //(1)
        Student stu=new Student(); //当电话号码重复时,应该抛出异常
        stu.setId(3);   //如果不指定学生的id,那么增加学生的过程中,之前的学生信息会被覆盖掉
        stu.setUsername("zhaoliu");
        stu.setPhone("200207216799");
        stu.setJavaScore(93);
        stu.setMathScore(88);
        StuMan.add(stu);//调用add方法增加学生
        //(2)
        System.out.print("请输入您要查找的学生的名字(如:lisi):");
        String findUsername=scanner.next();
        List<Student> students=StuMan.findByUsername(findUsername);  //调用findbyUsername函数找到符合条件的学生信息
        if(students.isEmpty()){    //输出结果
            System.out.println("未找到用户名为"+findUsername+"的学生。");
        }
        else{
            System.out.println("用户名为"+findUsername+"的学生如下所示:");
            for(Student student:students){
                System.out.println("学生id:"+student.getId());
                System.out.println("学生姓名:"+student.getUsername());
                System.out.println("电话号码: " + student.getPhone());
                System.out.println("Java 分数: " + student.getJavaScore());
                System.out.println("数学分数: " + student.getMathScore());
                System.out.println();
            }
        }
        //(3)
        List<Student> sortStu=StuMan.sortAvg();
        System.out.println("用sorted set按平均成绩降序排序:");
        for(Student student:sortStu){
            System.out.println(student.toString()); //如果不使用toString(),那么输出的结果是对象哈希码
            System.out.println();
        }
        //(4)
        List<Student> Stu = sortAvgBySortingParam(1);
        System.out.println("用SortingParams实现按平均成绩降序排序:");
        for (Student student : Stu) {
            System.out.println(student);
        }
    }
}
【问题简述】:

需要注意点就是使用toString(),因为在将student中的数据输出时,如果不使用toString()方法,那么输出的结果将会是student对象哈希码,那么我们将无法看到正确的输出结果。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值