美文网首页
java中的集合框架五:Map

java中的集合框架五:Map

作者: 在努力中 | 来源:发表于2018-06-02 16:33 被阅读0次

    Map
    ->是一种映射关系,以键值对的方式存在。可以通过key快速查找到value
    ->key-value两个属性均可以是任意类型的对象,但是键值对作为整体是以Entry类型的对象实例形式存在
    ->key不可重复,value可以重复,可以多个key值对应同一个value,但是每个key只能对应到唯一的值(这个值可以是多个键的值)
    ->Map也是支持泛型的,语法:Map<K,V>
    语法Collection不同的是,Map的方法如下
    添加、put(K key,V value)
    返回key值的集合:keySet()
    返回value值的集合:cvalues()
    返回键值对的集合:entrySet()

    HashMap是Map接口的重要实现类,基于哈希表实现的

    HashMap中的对象是无序排列的,key和value都是可以为null,但是一个HashMap只能有一个null的key(key不可重复)

    案列学习:
    通过Map<String ,Student>进行学生管理
    key为学生id,value为学生对象
    通过键盘输入学生信息
    对学生信息进行增删改查的操作
    
    package collections.collection;
    
    import java.util.HashSet;
    import java.util.Set;
    /**
     *学生类
     */
    public class Student {
        String id;
        String name;
        // Set和List一样,都是Collection的子接口
        Set<Course> cousers;//因为是可以选多个课程,所以用集合
        public Student(String id, String name) {
            super();
            this.id = id;
            this.name = name;
            this.cousers = new HashSet<Course>();
        }
    }
    
    

    测试类

    package collections.collection;
    
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Scanner;
    import java.util.Set;
    /**
     * 1、添加方法
     *  -|1.put()
     * 2、删除方法
     *  -|2.remove(Object o);//删除集中中的指定元素
     * 2、三种返回集合的方法
     *  -|3.Map的keySet方法----返回所有键
     *  -|4.entrySet方法,返回Map集合中所有的键值对
     *  -|
     *  
     * 3、修改 put
     * o.get(key) = 对应的value.是键值对上,值的对象,不是具体值(暂时总结这样)
     * 
     *
     */
    public class MapTest {
    
        /**
         * 用来承装学生类型对象
         * Map<String,Student>使用泛型
         */
        public Map<String,Student> students;
        
        /**
         * 在构造方法中初始化属性 students
         * @param args
         */
        public MapTest(){
            // 在构造方法中,实例化HashMap
            this.students = new HashMap<String,Student>();
            
        }
        
        /**
         * 1.添加方法,键盘输入学生ID,判断是否被占用
         * 如果没有被占用,则继续输入学生姓名,并创建学生对象,添加到students中
         * @param args
         */
        public void testPut(){
            //创建Scanner对象,用来获取输入的学生ID和姓名
            Scanner sc = new Scanner(System.in);    
            /*
             * 判断输入的ID是否被占用(是否为空)
             */
            // 获取到键盘输入的ID
            int i = 0;
            while(i<3){
            System.out.println("请输入学生的ID");
            String ID = sc.next();
            Student st = students.get(ID);
            // 如果为空,不被占用
            if(st == null){
                System.out.println("请输入姓名");
                String name = sc.next();
                // 新建学生对象
                Student newStu = new Student(ID, name);
                // 调用添加方法 键值对   ID和学生对象
                students.put(ID, newStu);
                System.out.println("成功添加学生"+students.get(ID).name);
                i++;
            }else{
                System.out.println("该学生ID已被占用");
                continue;
            }
        }   
    }
        
        
        
        /**
         * 2.测试删除方法
         * @param args
         */
        public void testRemove(){
            // 输入要删除的ID
            System.out.println("请输入要删除的学生的ID:");
            Scanner sc = new Scanner(System.in);
            
            while(true){
                // 从键盘获取待删除的ID
                String ID = sc.next();
                // 判断该ID是否有对应的学生对象
                Student st = students.get(ID);
                if(st == null){
                    System.out.println("该ID的学生不存在,请重新输入");
                    continue;//如果是空的,说明是true,因为判断 == null,此时为空返回值为真,循环继续
                }
                // 如果Id存在不为空。则删除
                students.remove(ID);
    //          System.out.println("33333333333333333333");
                System.out.println("成功删除学生 "+st.name+st.id+"ID"+ID);
                break;
            }
            
        }
        /**
         * 3.测试Map的keySet方法--返回所有键
         *      此时因为已经通过泛型规定了键的类型,所以要用泛型去接受keyset方法返回值
         * @param args
         */
        public void testKeySet(){
            // 通过keyset方法,返回Map集合中所有“键”的Set集合
            Set<String> keySet = students.keySet();
            System.out.println(keySet.getClass());
            // class java.util.HashMap$KeySet
            
            // 遍历输出key值,然后通过get方法来获取value值
            System.out.println("一共有 "+keySet.size()+" 个学生");
            for (String ID : keySet) {
                // 通过get方法来获取value值
                Student st = students.get(ID);
                // 
                if(st!=null){
                    // 遍历出来的iD有学生对象
                    System.out.println("学生ID:"+ID+"   学生姓名:"+st.name);
                }   
            }
        }
        
        
        /**
         * 4.entrySet方法,返回Map集合中所有的键值对
         */
        public void testEntrySet(){
            // .entrySet方法,返回Map集合中所有的键值对
    //      Set<Entry> entrySet = students.entrySet();//Entry是Map的一个内部类,Entry本身是泛型
            Set<Entry<String, Student>> entrySet = students.entrySet();
            for (Entry<String, Student> entry : entrySet) {
                System.out.println("取得的键 :"+entry.getKey());
                System.out.println("取得的值对象(学生对象) :"+entry.getValue());
                System.out.println("取得的值 :"+entry.getValue().name);
                System.out.println("取得的值 :"+entry.getValue().id);       
            }       
        }
        /**
         * 5、修改
         * @param args
         */
        public void testModify(){
            // 输入要修改的ID
            System.out.println("输入要修改学生的ID");
            Scanner sc = new Scanner(System.in);
            while(true){
                // 取得键盘输入的值
                String ID = sc.next();
                // 获取ID相对应的对象
                Student stu = students.get(ID);
                // 判断对象是否存在
                if(stu ==null){
                    System.out.println("该对象不存在,请重新输入");
                    continue;// 重新循环
                }
                // 当前对象的name
                System.out.println("该ID学生的名字为  "+stu.name);
                // 输入新的名字
                System.out.println("请输入新的学生名");
                String name = sc.next();
                // 值重新赋值(这里需要新建学生对象)
                Student newStu = new Student(ID,name);
                // 修改(赋新值)
                students.put(ID, newStu);
                System.out.println("修改成功");
                break;
            }
        }
        
        
        
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            MapTest mt = new MapTest();
            mt.testPut();
            mt.testKeySet();
            mt.testRemove();
            mt.testEntrySet();
            mt.testModify();
            mt.testKeySet();
        }
    
    }
    

    相关文章

      网友评论

          本文标题:java中的集合框架五:Map

          本文链接:https://www.haomeiwen.com/subject/ngprsftx.html