【面向对象版】HashMap(增删改查)

来源:互联网 发布:动态最优化基础ppt 编辑:程序博客网 时间:2024/05/16 12:03
【面向对象版】HashMap(增删改查)

前言:

关于什么是HashMap,HashMap可以用来做些什么,这些定义类的描述,请参照【简易版】HashMap(增删改查)的内容。

这章节主要是面向实例,直接进行HashMap(增删改查)的演示。废话不多说,让我们逐一看一下下面的代码。

一, HashMap前期准备:

1. student类的创建

 Student类

2.studentservices类框架的创建

 HashMapServices类

二,对studentservices类的逐断代码分析

段落1:数据初始化

思路注释:

任何数据都需要一个地方来进行存储。一般情况下数据会存放在内存,本地磁盘,外部磁盘(存储),数据库中。因为我们还未涉及到数据库等方面的讲解,因此以下案例是按照存放在系统内存的方式进行存放的。

private HashMap students = null;    //是代表创建一个HashMap,变量为students,内容为空。

public HashMapServices(){ students = new HashMap(); }   //是代表初始化这个空字典

1
2
3
4
5
6
7
8
9
10
11
12
/**
     * 思路:
     * (1)以下所有方法都必须基于有数据的情况下方可进行.因此首先要考虑的是数据的添加.
     * (2)数据添加要么存储在数据库中,要么外部 磁盘中,要么本地类中.(本章范例是列举本地类中的存放方法)
     * (3)既然存放本地类,那么就需要先定义一个存放地址.下面是通过HashMap存放方法进行演示.
     * (4)创建类时初始化数据
     */
    private HashMap students = null;
    //初始化数据
    public HashMapServices(){
        students = new HashMap();
    }

 段落2:添加学员信息

思路注释:空字典我们已经在上述创建好了,为了增删改查的操作首先要向空字典中传入数据。下面提供2个方法来对空字典进行赋值追加。

students.put(student.getStuName(), student); // (1)students为空列表。(2).put在这里为添加,添加内容是先获取到StuName()后再添加。原因是StuName为key,key在字典中唯一。(3)student为参数(也就是字典中value的值)

重载部分:对于每个构造函数都不应该只有一种方法。这里是把Student类中重载所设定的3个参数,作为另一种方法来创建实例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
     * 添加一个学生(面对对象版)
     * @param student
     */
    public void addStudent(Student student){
        students.put(student.getStuName(), student); //key为StuName,value为addStudent方法中的变量。(通过stuName来进行获取)
         
    }
    /**
     * 重载
     * @param stuName    学生姓名
     * @param stuNumber  学员编号
     * @param classCord  班级编号
     */
    public void addStudent(String stuName,String stuNumber,String classCord){
        Student student = new Student();   //调用Student类
        this.addStudent(student); //直接addStudent这个类中的方法.
         
    }

 段落3:获取学员信息

注释:说完了添加,再来看看获取。要知道获取信息对于“增删改查“来说,除了添加以外其他方法都需要涉及到的。不管你对数据做任何的更改,首先都必须要先得到要更改的数据才可以进行下一步的操作。所以对于获取而言尤为的重要,也是相对比较复杂的部分。下面我们分了多种状态(多态)来逐一模拟现实中需要获取学员信息时所需要的各种方法。一起来看一下代码。

(1)通过学员姓名进行获取

一般这种获取方式是最常见也是最普遍的。例如我们的手机通讯录中就是如此,当我们想知道一个人的电话或者地址信息时,只要记住他的名字或者说昵称。就可以通过姓名查询的方式直接找到他的电话或地址。那么我们下面的这个例子也是一样。通过学员的姓名直接找到他所在的班级以及他对应的学员编号。

思路注释:

<1> 创建一个getStudentByName的构造方法,传参(为姓名)。

<2> if(students != null && students.size()>0)  //首先先判断一下students这个字典是否为空。因为上面我们已经追加了数据所以这里肯定不为空。但是作为代码的严禁要求而言,应该有这么一条判断存在。

<3>  Student student = (Student)this.students.get(name);  //通过创建Student类实例,来调用student类中的.get()方法。这里的name其实就是stuName.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
 * 根据学生姓名获取一个学生信息
 * (注释:因为用的是HashMap存储数据,因此stuName唯一,所以通过姓名查找精确度高)
 * 强调:要想获取首先要先有数据才可以,因此首先参考追加类然后再来看获取
 * @param name  学生姓名
 * @return
 */
public Student getStudentByName(String name){
    if(students != null && students.size()>0){
        //.get(name)实际上就是获取stuName.获取的是students列表中的信息.
        Student student = (Student)this.students.get(name);
        return student;
    }
    return null;
}

(2)通过班级编号来获取学员信息

当我们不记得学员姓名,只记住他属于哪个班级的时候,往往我们就需要通过班级编号来进行查找。但是如果是用班级编号来查的话,那么得到的学员数量肯定不只一个。这种情况我们就要提前设定一个集合来提前存放我们返回的多个学员的信息。下面的案例是通过ArrayList列表的方式来选择存放数据的。

思路注释:

<1> 创建getStudentByClassCord构造方法(传参)。classNo为按照班级编号参数

<2> 创建ArrayList集合,为了存储返回多个同学的信息。 

<3> for循环遍历students字典中数据的key和value.最终取的是value中classCord的信息。先打印value信息。

<4> if(obj.getClassCord().contains(classNo)){ result.add(obj); }  // if语句判断。先.getClassCord()找到所有班级编号再.contains(classNo).判断是否包含要查找的classNo。

<5> 最终输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
     * 根据班级编号分类查找学员信息
     * (注释:因为classCord是可能重复的,因此返回信息应该是通过一个列表进行接收,因此这里定义ArrayList进行接收.)
     * @param classNo  班级编号
     * @return         集合
     */
    public ArrayList getStudentByClassCord(String classNo){
        ArrayList result = new ArrayList();
        for(Object key:this.students.keySet()){
            Student obj =(Student)this.students.get(key);
            System.out.println(obj);
            if(obj.getClassCord().contains(classNo)){
                result.add(obj);
            }
        }
        return result;
    }

(3)通过学员编号来获取学员信息

通过学员编号跟通过班级编号的获取方式基本相同,因此在这里不重复说明。

温馨提示:代码中.contains()也可以通过.indexof()的方式进行判断。但是通过.indexof()的话必须加上!=-1,才代表找到了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
     * 根据学员编号来查找学员信息
     * (注释:同上.因为stuNo也是有可能重复的,因此返回信息应该也是通过一个列表进行接收,因此这里定义ArrayList进行接收.)
     * @param stuNo
     * @return
     */
    public ArrayList getStudentByStudentNo(String stuNo){
        ArrayList result1 = new ArrayList();
        for(Object key:this.students.keySet()){
            Student obj =(Student)this.students.get(key);
            System.out.println(obj);
            if(obj.getStuNumber().contains(stuNo)){
                result1.add(obj);
            }
        }
        return result1;
    }

(4)通过输出的学员编号和教室编号查找学员信息

上述我们已经逐一对学员编号进行查找以及依据教室编号进行查找列举了方法。但是日常生活中还有一种情况是需要从大量的学员中找出同属于相同班级以及学员编号重复的信息。一般不建议学员编号重复,但是一旦出现重复的情况我们也可以通过这种方法进行排查。就好比我们的身份证是唯一的,但是有时候会听新闻报出来说某某地区谁谁谁的身份证号跟谁谁谁的重复的case。所以这种情况是存在的,为了更好的排查信息的唯一性,因此在此写了一下代码。

思路注释:

<1> 创建getStudentNoEqulesClassNo类,设定2个参数(stuNo学员编号,classNo教室编号)。

<2> 创建一个ArrayList存放返回值。(返回值可能为多个,因此通过ArrayList方式存储。也可HashMap)。

<3> 同上。先获取key,value后再从value中指定要搜索的stuNo和classNo。这里用到了&&,代表必须满足2个条件后,结果才成立。

<4> 最终输出匹配到的学员信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
     * 根据输入的学员编号和教室编号,查找相同学员编号和相同教室编号的学员信息
     * @param stuNo
     * @param classNo
     * @return
     */
    public ArrayList getStudentNoEqulesClassNo(String stuNo,String classNo){
        ArrayList result2 = new ArrayList();
        for(Object key:this.students.keySet()){
            Student obj =(Student)this.students.get(key);
            System.out.println(obj);
            if(obj.getStuNumber().contains(stuNo)&& obj.getClassCord().contains(classNo)){
                result2.add(obj);
            }
        }
        return result2;
    }

(5)获取所有学员信息 

这种情况也极为普遍,确切的应该说是必不可缺少的存在。特别对于数据初始化而言。当我们把所有数据都添加到字典中后,首先要先打印出来看一下是否这些数据都已经输入进去了。所以下面的代码无非是通过HashMap以及ArrayList存储数据的不同版本而已。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
     * 获取所有学生信息
     * (1)通过HashMap版本获取
     * (2)通过ArrayList版本获取
     * @return
     */
    public HashMap getAllStudent_HashMap(){
        return this.students;
    }
     
    public ArrayList getAllStudent_ArrayList(){
        ArrayList result = new ArrayList();
        for(Object key:this.students.keySet()){
            Student obj =(Student)this.students.get(key);
            result.add(obj);
        }return result;
    }

 段落4:删除学员信息 

上面已经说了除了追加以外任何对原数据的变更,都是基于先找到该数据。因此对于删除而言也是一样,先查找再删除。

思路注释:

首先同追加,查找一样。对于删除也同样给了多个构造方法。下面方法1其实是直接调用了方法2中的构造方法。因此主要还是对方法2,通过stuName删除进行具体分析。思路如下。

<1>  创建delStudent类,赋参数(参数为stuName根据学生姓名查找)。注意的是这边是定义一个boolean类型的构造方法,需要结果返回true或者false.

<2>  if(students != null && students.size()>0)同上首先判断students字典中是否有值。

<3>  Student student = this.getStudentByName(stuName); if(student == null){ return false; }  //第一个分号前语句为定义变量student,然后赋值。赋的是通过.getStudentByName(stuName)这个构造方法得到stuName值。第二个分号前面的是if语句判断刚刚定义的这个student变量中接收到的值是否为空。如果为空就返回flase.

<4> 对于下面的代码一并解释。当删除一个数据时为了避免数据直接被删除,首先先给一个提示是否确定要删除后,再删除。起到一个二次确认的作用。

  定义变量isOK来接收Scanner键盘输入传进来的值,如果为y就执行this.students.remove(stuName);并返回true。如果不相等返回false.

1
2
3
4
5
6
7
System.out.println("您确定要删除该学员信息吗? [确定]:y,[取消]:n");
             
            String isok = input.next();
            if(isok.equals("y")){
            this.students.remove(stuName);
            return true//对于删除的结果给一个返回值
            }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
     * 删除一个学生(面对对象版)
     * @param student
     */
    //直接调用下面的方法进行删除
    public boolean delStudent(Student student){
        String stuName =student.getStuName();//也是通过StuName来进行删除,先获取到StuName
        return this.delStudent(stuName); //通过调用delStudent方法来执行删除操作
    }
    /**
     * 通过stuName删除
     * @param stuName
     */
    public boolean delStudent(String stuName){
        //先判断students列表中有没有数据后再删除
        Scanner input = new Scanner(System.in);
        if(students != null && students.size()>0){
            /**
             * 判断有没有这个学生.找到后再删除
             */
            Student student = this.getStudentByName(stuName);
            if(student == null){
                return false;
                }
            System.out.println("您确定要删除该学员信息吗? [确定]:y,[取消]:n");
             
            String isok = input.next();
            if(isok.equals("y")){
            this.students.remove(stuName);
            return true//对于删除的结果给一个返回值
            }
        }
        return false;  //没找到对象给返回值
    }

 段落5:更改学员信息 

思路注释:

方法1:

<1>  创建updateStudent构造方法(传参)。参数为student。

<2>  同上if语句判断students字典是否为空

<3>  Student studen = this.getStudentByName(student.getStuName());   //定义变量studen后赋值。获取方式是调用.getStudentByName方法中student类中的get方法,最终获取.getStuName()中的值。

<4>  this.students.put(student.getStuName(), student);  //put在这里是追加更新的意思。key是student.getStuName()我们获取到的值,value为修改后的结果。

方法2(重载):

<1> 重载,设定参数。 public boolean updateStudent(String stuName,String stuNumber,String classCord)。

<2> Student student = this.getStudentByName(stuName);  // 通过.getStudentByName(stuName)获取学生姓名的方式进行查找。

<3> student.setStuNumber(stuNumber); student.setClassCord(classCord); return updateStudent(student); //第一个分号内容:通过stuName获取到value信息后。通过student类中的set方法对stuNumber进行修改。第二个分号内容:同上也是通过student类中.setClassCord进行修改。第三个分号内容:return updateStudent(student)这里的student其实是stuName.再通过stuName获取到已经被更改掉的value信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    /**
     * 修改一个学生(面向对象版)
     * @param student
     */
    public boolean updateStudent(Student student){
        if(students != null && students.size()>0){
            /**
             * 判断有没有这个学生.找到后再变更
             */
            Student studen = this.getStudentByName(student.getStuName());
            if(studen == null){
                return false;
            }
            this.students.put(student.getStuName(), student);
            return true//对于删除的结果给一个返回值
        }
        return false;  //没找到对象给返回值
    }
    /**
     * 重载
     * @param stuName
     * @param stuNumber
     * @param classCord
     */
    public boolean updateStudent(String stuName,String stuNumber,String classCord){
        Student student = this.getStudentByName(stuName);
        student.setStuNumber(stuNumber);
        student.setClassCord(classCord);       
        return updateStudent(student);
    }
}

三,创建HashMapTest测试类

对于studentservices类的框架创建完毕后。接下来就是我们在测试类中进行测试结果了。测试类结果代码如下。

 HashMapTest(测试类)

四,HashMapTest测试类代码逐一分析

段落1:数据初始化

接下来的代码因为较长的缘故,都选择扩展打开方式。

思路注释:

<1>   Student student = null;为创建Student实例。初始化结果为:Student st1 = new Student("王小天", "cn0001", "class0001");等等(追加条目)
<2>   调用HashMapServices hashmapservices = new HashMapServices();实例

<3>  hashmapservices.addStudent(st1);  //通过hashmapservices类中的addStudent方法追加学生信息。st1为上述Student实例化后赋值的变量。

 View Code

段落2:追加一个学员信息

思路注释:

<1>  创建Student实例,通过Scanner键盘输入的方式进行添加。

<2>  通过Student类中.set方法,去.set  StuName和.setStuNumber,.setClassCord的值。括号传入的是input.next()键盘输入进来的值。

<3>  通过hashmapservices.addStudent(变量)的方式把输入的值add到hashmapservices字典中去。

<4>  通过Myeclipse8.5中的Extract Superclass..方法把输出结果做一个 show(hashmapservices);方法。这样做的好处是不管其他方法再显示信息时可以直接调用这个方法。

<5>  对于遍历结果的代码中的ArrayList result = hashmapservices.getAllStudent_ArrayList();因为获取的是所有学员的信息。所以这里直接调用的是hashmapservices类中的.getAllStudent_ArrayList()这个方法。

 追加学员信息

 段落3:删除一个学员信息

思路注释:

<1>  创建Scanner输入删除学员提示,并设定变量接收键盘输入值。

<2>  通过if,else语句判断删除学生的名字(stuName)。if语句中是通过hashmapservices类中.delStudent(stuName)方法进行删除。

<3>  最终输出结果。找到了该学员就删除。没有找到返回“删除失败!”。

 删除学员信息

结果:(这里连同追加学员信息一并显示结果)

 段落4:修改一个学员信息

思路注释:

<1>  同样通过.getStudentByName方法通过查询stuName先事先找到该学员

<2>  设置变量接收键盘输入的值(输入为修改学员姓名,编号及班级编号)

<3>  if,else循环语句,调用hashmapservices.updateStudent方法更新。student参数为stuName。

<4> 最终输出信息。

 修改一个学员信息(根据stuName查询)

结果:

输出结果大于1.(输出来的结果至少不会小于1个)

 段落5:查找一个学员信息(通过学员班级编号查找学员信息)

注释:对于查找学员的方法很多,可以通过stuName(学员姓名),stuNumber(学员编号)也可以通过classCord(班级编号)等方式进行查找。当然如果student类在定义的时候不止这3个参数还可以通过其他的方式对学员进行查找。下面的代码中我们选中几种平时会经常遇到的场景进行分析。

【classCord进行查找】

 思路注释:

<1>  Scanner键盘输入,设定变量接收结果

<2>  因为classCord查询结果会有重复性,因此设定一个集合进行值的接收

<3>  集合接收的对象为classNo。因此还是通过hashmapservices类方法中的.getStudentByClassCord方法查询。

<4> 最终遍历结果显示。 这里不能继续使用show方法。因为show方法中也同时存在一个ArrayList集合。因此需要手动遍历结果。

 查找学员信息(通过classCord进行查找)

结果:

 段落5:查找一个学员信息(通过学员编号查找学员信息)

注释:对于查找学员的方法很多,可以通过stuName(学员姓名),stuNumber(学员编号)也可以通过classCord(班级编号)等方式进行查找。当然如果student类在定义的时候不止这3个参数还可以通过其他的方式对学员进行查找。下面的代码中我们选中几种平时会经常遇到的场景进行分析。

【stundentNo进行查找】

 思路注释:(同classCord方法无差别)

<1>  Scanner键盘输入,设定变量接收结果

<2>  因为stuNo查询结果会有重复性,因此设定一个集合进行值的接收

<3>  集合接收的对象为classNo。因此还是通过hashmapservices类方法中的.getStudentByStudentNo方法查询。

<4> 最终遍历结果显示。 这里不能继续使用show方法。因为show方法中也同时存在一个ArrayList集合。因此需要手动遍历结果。

 查询学员信息(通过stuNumber查询)

结果:(同样输出结果大于等于1个)

  段落6:查找一个学员信息(通过输入的学员编号和教师编号查找相同学员编号和相同教室编号的学员信息)

注释:如果想要筛选学员编号跟教室编号相同的方法请参考下列代码

【stundentNo和classCord进行查找】

 思路注释:

<1>  Scanner键盘输入,设定变量接收结果。(2个变量 1个是接收studentNo的1个是接收classNo的)

<2>  同样studentNo跟classCord查询结果会有重复性,因此设定2个集合分别进行值的接收

<3>  通过hashmapservices.getStudentNoEqulesClassNo类中的方法分别传参。(传入的是键盘输入的stuNo和calssNo)

<4> 最终遍历结果显示。

复制代码
package com.java.demo_9;import java.util.ArrayList;import java.util.HashMap;import java.util.Scanner;public class HashMapServicesTest {    public static void main(String[] args) {        /**         * 系统初始化         */        System.out.println("系统初始化过程中....");        ;        Student student = null;        HashMapServices hashmapservices = new HashMapServices(); // 创建HashMapServices实例,为了接下来调用其中的方法        /*         * for(int i=0;i<=10;i++){ if(i<=5){ student = new Student("student"+i,         * "cn000"+i, "s100"+i);} else{ student = new Student("student"+i,         * "cn000"+i, "s200"+i);} hashmapservices.addStudent(student); }         */        /**         * 定义学生信息并添加         */        Student st1 = new Student("王小天", "cn0001", "class0001");        Student st2 = new Student("张天爱", "cn0002", "class0002");        Student st3 = new Student("武则天", "cn0003", "class0003");        Student st4 = new Student("小钢炮", "cn0004", "class0004");        Student st5 = new Student("屠龙刀", "cn0005", "class0005");        hashmapservices.addStudent(st1);        hashmapservices.addStudent(st2);        hashmapservices.addStudent(st3);        hashmapservices.addStudent(st4);        hashmapservices.addStudent(st5);        System.out.println("系统初始化结束!");        System.out.println("=================添加一个学生信息========================");        Student stu = new Student(); // 创建Student实例,为了接下来调用其中方法        Scanner input = new Scanner(System.in);        System.out.println("请输入学员姓名:");        stu.setStuName(input.next()); // 通过.setStuName的方式对键盘输入值进行设定.这里指设定添加学员姓名        System.out.println("请输入学员编号:");        stu.setStuNumber(input.next()); // 通过.setStuName的方式对键盘输入值进行设定.这里指设定添加学员编号        System.out.println("请输入教室编号:");        stu.setClassCord(input.next()); // 通过.setStuName的方式对键盘输入值进行设定.这里指设定添加教师编号        hashmapservices.addStudent(stu); // 添加新加学员信息        System.out.println("=================显示学生信息========================");        show(hashmapservices); // 做一个封装.把显示信息放到下面.        System.out.println();        System.out        .println("=================查找学生信息(通过输入的学员编号和教师编号查找相同学员编号和相同教室编号的学员信息)========================");                System.out.println("请输入查找学生的学员编号:");        String stuNo = input.next();        System.out.println("请输入查找学生的教师编号:");        String classNo = input.next();        ArrayList result2 = hashmapservices.getStudentNoEqulesClassNo(stuNo, classNo);                System.out.println();        System.out.println("=================显示学生信息========================");        System.out.println();        for (Object obj : result2) {            System.out.println(obj);        }    }    private static void show(HashMapServices hashmapservices) {        ArrayList result = hashmapservices.getAllStudent_ArrayList(); // 调用的是HashMapServices类中.getAllStudent_ArrayList()这个方法        // 编例输出        for (Object obj : result) {            System.out.println(obj);        }    }}
原创粉丝点击