HashMap
大家都知道,HashMap是一种常见的以键值对形式存储数据的一种动态数据结构, 键名不能重复,否则会覆盖前一条同名数据。
HashMap的声明方式也很简单,和List接口的具体实现类声明基本相同。
HashMap<Integer, String> map = new HashMap<>();
需要注意的是在添加泛型的类型时,类型不可为基本数据类型。必须是封装类的数据类型。
HashMap常用的几个方法
System.out.println(map);//查看hashmap
System.out.println(map.remove(4));//按键删除
System.out.println(map.get(5));//获取该键的值
System.out.println(map.size());//判断hashmap长度,有几个键就有多大
HashMap实现学生管理系统的删除功能
需求:
简单学生管理系统:每名学生都有属于自己的唯一编号,即学号。在毕业时需要将该学生的信息从系统中移除。下面编写 Java 程序,使用 HashMap 来存储学生信息,其键为学生学号,值为姓名。毕业时,需要用户输入学生的学号,并根据学号进行删除操作。
直接上源代码:
不对的地方或者有更好的思路欢迎指正:
public class StudentManager {
HashMap<Integer, String> hmp=new HashMap<>();
public int putInfo(){
int i=0;
Scanner sc=new Scanner(System.in);
while(true){
System.out.println("请输入要删除的毕业生的学号:");
if(sc.hasNextInt()){
i=sc.nextInt();
System.out.println("您删除的是学号为"+i+"的毕业生信息");
break;
}
else{
System.out.println("您的输入有误,请重新输入");
}}
return i;
}
public int jiXu(){
int in;
while(true){
System.out.println("是否要继续删除?是请输入1,否请输入0");
Scanner sc=new Scanner(System.in);
if(sc.hasNextInt()){
in=sc.nextInt();
if(in==1){
in=new StudentManager().putInfo();
break;
}
else if(in==0){
break;
}else {
System.out.println("您的输入有误");
break;
}
}}
return in;
}
public void Info(){
hmp.put(20190905, "王五");
hmp.put(20190904, "李四");
hmp.put(20190903, "张三");
hmp.put(20190902, "张全蛋");
hmp.put(20190901, "大哥大");
System.out.println(hmp);
int key=new StudentManager().putInfo();
while(true){
if(hmp.containsKey(key)==true){
hmp.remove(key);
System.out.println("操作完成");
System.out.println(hmp);
key=new StudentManager().jiXu();
if(key==0){
break;
}
}else{
System.out.println("不存在该学生的信息!");
key=new StudentManager().jiXu();
}
}
}
public static void main(String[] args) {
StudentManager ssm=new StudentManager();
ssm.Info();
}
}
运行截图:
有一点值得注意的地方是,这个程序目前不存在判断HashMap被删的是否为空的情况下还能否让用户去进行删除操作,所以在实现删除方法的语句块中可以加入HashMap的isempty方法来判断HashMap是否为空。
继续完善上面的代码,前面的代码在我的反复运行下发现了两个bug:
- 在第一个输入方法运行的时候,输入不相对应的学号,系统会提示你学号错误,而输入非数字的时候,就会陷入死循环,原因是在scanner中判断hasnextint时没有作else分支判断。
- 在继续输入当中,如果我们执行的操作是1或者0或者其他数字时,程序都会按照正常进行,但当你输入的数字时map里面任意一个尚存在的函数,则会发现系统提示输入有误的同时还会将该学号对应的信息删除,这样势必显的程序运行驴头不对马嘴。原因是在继续输入的方法里面,将else输入的值直接传到程序方法里面了。
程序改进代码:
public class StudentManager {
HashMap<Integer, String> hmp=new HashMap<>();
public int putInfo(){
int i=0;
Scanner sc=new Scanner(System.in);
while(true){
System.out.println("请输入要删除的毕业生的学号:");
if(sc.hasNextInt()){
i=sc.nextInt();
System.out.println("您删除的是学号为"+i+"的毕业生信息");
break;
}
else{
System.out.println("您的输入有误!");
break;
}}
return i;
}
public int jiXu(){
int in;
while(true){
System.out.println("是否要继续删除?是请输入1,否请输入0");
Scanner sc=new Scanner(System.in);
if(sc.hasNextInt()){
in=sc.nextInt();
if(in==1){
in=new StudentManager().putInfo();
break;
}
else if(in==0){
break;
}else {
System.out.println("您的输入有误");
in=0;
break;
}
}}
return in;
}
public void Info(){
hmp.put(20190905, "王五");
hmp.put(20190904, "李四");
hmp.put(20190903, "张三");
hmp.put(20190902, "张全蛋");
hmp.put(20190901, "大哥大");
System.out.println(hmp);
int key=new StudentManager().putInfo();
while(true){
if(hmp.containsKey(key)==true){
hmp.remove(key);
System.out.println("操作完成");
System.out.println(hmp);
key=new StudentManager().jiXu();
if(key==0){
break;
}
}else{
System.out.println("不存在该学生的信息!");
key=new StudentManager().jiXu();
}
}
}
public static void main(String[] args) {
StudentManager ssm=new StudentManager();
ssm.Info();
}
喜欢我的…思路和代码的大佬给我点个赞,如果你有更好的思路,请关注我,希望得到你的指点~
如果你是大神,求你带带我吧…