最近课下作业有点重(其实是我不会),导致我没寄出来什么时间,今天就炒炒冷饭,之前用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;
}
}
}
}
哎,又划水了!!!