java中的集合框架五:Map

2018-06-02  本文已影响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();
    }

}
上一篇下一篇

猜你喜欢

热点阅读