HashSet实现学生信息管理

最近课下作业有点重(其实是我不会),导致我没寄出来什么时间,今天就炒炒冷饭,之前用ArrayList做过一个信息管理,今天就弄一个HashSet版的吧

Student类

HashSet通过hashcode和equals保证重复数据不会插入,我们重写他们,只让学号不同的无法插入

public class Student {
    public String id;
    public String name;
    public int age;

    public Student(String id,String name,int age){
        this.age=age;
        this.id=id;
        this.name=name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Student student = (Student) o;

        if (id != null ? !id.equals(student.id) : student.id != null) return false;
        return true;
    }

    @Override
    public int hashCode() {
        return 0;
    }

    @Override
    public String toString() {
        return"学号:"+id+"\t"+"姓名:"+name+"\t"+"年龄:"+age;
    }
}

manage类,即测试类,遇到的一些问题都被注释在代码里了

import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;

public class Manage {
//    插入模块
    public static void insert(HashSet<Student> hs){
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入学号:");
        String id=scanner.nextLine();
        System.out.print("请输入姓名:");
        String name=scanner.nextLine();
        System.out.print("请输入年龄:");
        int age=scanner.nextInt();
        Student student=new Student(id,name,age);
        hs.add(student);
//        hashset的add方法返回值是Boolean型,但貌似添加失败(数据重复)返回true,运行了一次才发现
        if(hs.add(student)==true){
            System.out.println("添加失败!!!");
        }else{
            System.out.println("添加成功!!!");
        }
    }

    public static void drop(HashSet<Student> hs){
//        先把要操作的hashset的长度记录下来,方便判断是否遍历完
        int count=hs.size();
//        如果hashset里没有数据那就无法进行删除操作
        if(hs.size()==0){
            System.out.println("没有学生信息,无法删除!!!");
        }else{
            System.out.print("请输入学号进行删除:");
            Scanner scanner=new Scanner(System.in);
            String id=scanner.nextLine();
            /*
            注意这里要用迭代器的remove方法操作,hashset没有下标无法用普通for循环
            用下面这种增强for循环又会报ConcurrentModificationException的异常
            虽然它底层是迭代器,但貌似用不了迭代器的方法。
            ConcurrentModificationException异常我只记得是每遍历一个元素就有两个什么参数加一,并且操作元素也会加一
            当两个值不相等就会报错,但是调用迭代器的方法就不会加一
        for(Student student:hs){
            if(student.id.equals(id)){
                hs.remove(student);
                System.out.println("删除成功!!!");
            }else{
                System.out.println("没有这个人......");
            }
        }
             */
            Iterator<Student> iterator=hs.iterator();
            while(iterator.hasNext()){
                if(iterator.next().id.equals(id)){
                    iterator.remove();
                    System.out.println("删除成功!!!");
                    break;
                }
            }
            if(hs.size()==count){
                System.out.println("没有这个人......");
            }
        }


    }

    public static void update(HashSet<Student> hs){
        int count=hs.size();
        if(count==0){
            System.out.println("没有学生信息,无法修改,请添加数据......");
        }else{
            System.out.print("请输入要修改学生信息的学号:");
            Scanner scanner=new Scanner(System.in);
            String id=scanner.nextLine();
            for(Student student:hs){
                int i=0;
                if(student.id.equals(id)){
                    System.out.println("请输入名字:");
                    String name=scanner.nextLine();
                    System.out.println("请输入年龄:");
                    int age=scanner.nextInt();
                    student.name=name;
                    student.age=age;
                    System.out.println("修改成功!!!");
                    break;
                }
                i+=1;
                if(i==count){
                    System.out.println("没有这个人......");
                }
            }
            /*
            当更新操作的时候,操作的就不是直接操作hashset的元素了,而是操作Student类的对象,可以不用迭代器
            事实上用迭代器(下面这种)反而会报NoSuchElementException的错误
            Iterator<Student> iterator=hs.iterator();
            while(iterator.hasNext()){
                int i=0;
                if(iterator.next().id.equals(id)){
                    System.out.println("请输入名字:");
                    String name=scanner.nextLine();
                    System.out.println("请输入年龄:");
                    int age=scanner.nextInt();
                    iterator.next().name=name;
                    iterator.next().age=age;
                    System.out.println("修改成功!!!");
                    break;
                }
                i++;
                if(i==count){
                    System.out.println("没有这个人......");
                }
            }
             */
        }
    }

    public static  void select(HashSet<Student> hs){
        int count=hs.size();
        if(count==0){
            System.out.println("暂无学生信息,请添加。");
        }else{
            System.out.print("请输入学号查询:");
            Scanner scanner=new Scanner(System.in);
            String id=scanner.nextLine();
            for(Student student:hs){
                int i=0;
                if(student.id.equals(id)){
                    System.out.println(student);
                    break;
                }
                i+=1;
                if(i==count){
                    System.out.println("查无此人......");
                }
            }
        }
    }

    public static void main(String[] args) {
        HashSet<Student> hs=new HashSet<>();
        System.out.println("请输入操作对应的数字");
        for(int i=0;;i++){
            System.out.println("1、增加学生信息");
            System.out.println("2、删除学生信息");
            System.out.println("3、修改学生信息");
            System.out.println("4、查询学生信息");
            System.out.println("5、退出");
            System.out.print("请输入操作对应的数字:");
            Scanner scanner=new Scanner(System.in);
            String number=scanner.nextLine();
            switch (number){
                case "1":
                    insert(hs);
                    break;
                case "2":
                    drop(hs);
                    break;
                case "3":
                    update(hs);
                    break;
                case "4":
                    select(hs);
                    break;
                case "5":
                    return;
                default:
                    System.out.println("输入错误......");
                    break;
            }
        }
    }
}

哎,又划水了!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值