JavaSE基础自学------集合框架---集合 Map

Map

Map集合:该集合存储的是键值对,一个键对应一个值,一对一对的往集合里存,需要保证键的唯一性

添加 :

  • put(K key, V value) ------将指定的值与此映射中的指定键关联
  • putAll(Map<? extends K,? extends V> m)

删除 :

  • remove(Object key) ------如果存在一个键的映射关系,则将其从此映射中移除
  • clear() ------从此映射中移除所有映射关系

判断 :

  • containsKey(Object key) ------ 如果此映射包含指定键的映射关系,则返回 true。
  • containsValue(Object value) -------如果此映射将一个或多个键映射到指定值,则返回 true。

获取 :

  • entrySet() ----- 返回此映射中包含的映射关系的 Set 视图。
  • keySet() ------- 返回此映射中包含的键的 Set 视图。
    .
  • get(Object key) -------返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
  • size() ------返回此映射中的键-值映射关系数。
  • values() -------返回此映射中包含的值的 Collection 视图

Map集合常见集合容器:(其实 Set底层就是使用Map集合)

  • Hashtable : 底层是哈希表数据结构,不可以存入null键null值, 线程同步(不常用)
  • HashMap : 底层是哈希表数据结构,可以存入null键null值,线程不同步
  • TreeMap : 底层是二叉树结构 ,可以对Map集合中的键进行排序 , 线程不同步

代码演示------

public class DEMO {

    public static void main(String[] args) {
        HashMap<String, String> hm = new HashMap<>();

        sop("put : " + hm.put("01", "张一"));
        sop("put : " + hm.put("01", "张0")); //键相同,后添加的会覆盖原先的值,并 put方法会返回被覆盖的值
        hm.put("02", "张二");
        hm.put("03", "张三");
        hm.put("55", "张四");
        hm.put("45", "张五");

        sop("containsKey: " + hm.containsKey("01"));

        sop("remove: " + hm.remove("02"));  //移除该键对应的值,并返回该值

        sop("get: " + hm.get("03"));  //获取该键对应的值,并返回该值

        Collection<String> c = hm.values();   //获取集合所有值
        sop(c);

        sop(hm);
    }

    public static void sop(Object obj) {
        System.out.println(obj);
    }
}

KeySet , entrySet(Map集合取出方式)

Map集合取出原理:将Map集合转成Set集合,通过Set集合的迭代器取出元素

  • Set < K > | KeySet() : 该方法会返回一个K类型的Set集合…将Map集合中所有的 键 存入到Set集合,因为Set具备迭代器, 以迭代方式取出所有键,再依据 get方法, 获取每一个键对应的值
  • Set<Map.Entry<K,V>> | entrySet() : 返回一个Set集合,将Map集合中的映射关系 (K----V)存入到Set集合中,这个映射关系的数据类型是 : Map.Entry<K ,V>,
    在这里插入图片描述
    KsySet();方法代码演示-----
public class DEMO {
    public static void main(String[] args) {
        HashMap<String, String> hm = new HashMap<>();

        hm.put("02", "张二");
        hm.put("03", "张三");
        hm.put("55", "张四");
        hm.put("45", "张五");

        Set<String> keySet = hm.keySet();   //keSet(),该方法会返回一个Set, 所有的键都会存入该Set集合

        Iterator<String> it = keySet.iterator();  //有了Set集合就可以获取迭代器对键进行迭代

        while (it.hasNext()) {
            String key = it.next();      //获取键

            String values = hm.get(key);   //有了键,就可以通过map集合的get方法获取其对应的值

            System.out.println("key: " + key + " | values :" + values);
        }
    }
}

EntrySet();方法代码演示-----

public class DEMO {
    public static void main(String[] args) {
        HashMap<String, String> hm = new HashMap<>();

        hm.put("02", "张二");
        hm.put("03", "张三");
        hm.put("55", "张四");
        hm.put("45", "张五");

        Set<Map.Entry<String, String>> entrySet = hm.entrySet();   //Map集合中的映射关系存入Set集合中,数据类型是Map.Entry

        Iterator <Map.Entry<String, String>> it = entrySet.iterator(); //迭代

        while (it.hasNext()){

            Map.Entry<String,String> me=it.next(); //获取Map.Entry类型对象,泛型为<String,String>

            String key=me.getKey();              //调用Map.Entry对象中的方法
            String values=me.getValue();

            System.out.println("key: "+key+"  values: "+values);
        }
    }
}


Map练习-----

/*
每一个学生都有对应的归属地
学生Student,地址String
学生属性:姓名 年龄
同一姓名,年龄视为同一学生
保证学生唯一性

学生对象可能存到HashMap或者TreeMap,所以都要定义这两个容器该有的属性

1,描述学生对象
2,定义Map容器,将学生作为键,地区作为值,存入
3,获取Map集合中的元素
*/

class Student implements Comparable<Student> {  //让学生对象具备可比性,自然排序
    private int age;
    private String name;

    Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public int hashCode() {          //根据条件自定义哈希值
        return name.hashCode() + age * 29;
    }

    public boolean equals(Object obj) {      //重写equals 方法,自定义判断条件
        if (!(obj instanceof Student)) {
            throw new ClassCastException("类型异常");
        }
        Student s = (Student) obj;
        return this.name.equals(s.name) && this.age == s.age;
    }

    public int compareTo(Student s) {         //以名字为主条件排序,年龄为副条件的自然排序
        int num = this.getName().compareTo(s.getName());
        if (num == 0) {
            return new Integer(this.getAge()).compareTo(s.getAge());
        }
        return num;
    }
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
    public String toString() {    //建立学生对象自定义的字符串
        return name + ":" + age;
    }
}

class AgeCompare implements Comparator<Student>{  //定义根据年龄为主条件排序.姓名为副条件的比较器
    public int compare(Student s1,Student s2){
        int num =new Integer(s1.getAge()).compareTo(s2.getAge());
        if (num==0){
            return s1.getName().compareTo(s2.getName());
        }
        return num;
    }
}

public class DEMO {
    public static void main(String[] args) {

        Map<Student, String> hm = new TreeMap<>(new AgeCompare());  //插入比较器
        hm.put(new Student("lisi 4", 15), "中山");
        hm.put(new Student("lisi 4", 15), "佛山");

        hm.put(new Student("lisi 3", 18), "西安");
        hm.put(new Student("lisi 1", 16), "武汉");
        hm.put(new Student("lisi 2", 10), "北京");

        sop("keySet;");
        //第一种方式取出: keySet();
        Set<Student> keySet = hm.keySet();
        Iterator<Student> it = keySet.iterator();

        while (it.hasNext()) {
            Student s = it.next();
            System.out.println(s.toString() + " 地区" + hm.get(s));
        }
        sop("-----------------------------------");
        sop("entrySet();");
        //第二种方式取出 : entrySet();
        Set<Map.Entry<Student, String>> entrySet = hm.entrySet();

        Iterator<Map.Entry<Student, String>> it1 = entrySet.iterator();

        while (it1.hasNext()) {
            Map.Entry<Student, String> me = it1.next();
            Student sd = me.getKey();
            String s = me.getValue();
            System.out.println(sd.toString()+" 地区:"+s);
        }
    }
    public static void sop(Object obj) {
        System.out.println(obj);
    }
}

TreeMap练习-----字符串中字母出现的次数

import java.util.*;  //导入集合类包
/*
获取 fds**fae++ws--dsa 字符串中字母出现的次数,
希望打印的结果是a(2)b(3)....

字母 与 出现次数, 存在映射关系 可以使用Map集合
 */
public class DEMO {
    public static void main(String[] args) {
       String s= charCount("fdsfae++wsdsa");
       sop(s);
    }

    public static void sop(Object obj) {
        System.out.println(obj);
    }

    public static String charCount(String str) { //定义功能
        char[] chs = str.toCharArray();   //将字符串转换成字符数组,对每一个字母进行操作

        Map<Character, Integer> tm = new TreeMap<>(); //因为打印的字母有顺序,所以使用TreeMap集合

        int num=0;
        for (int i = 0; i < chs.length; i++) {      //对夫妇数组进行遍历
            if (!(chs[i]>='a'&&chs[i]<='z' ||chs[i]>='A'&&chs[i]<='Z')){  //只输出大小写字母
                continue;
            }

            if (!tm.containsKey(chs[i])) {      //判断集合中是否有该键
                tm.put(chs[i], 1);              //没有该键,则向元素添加键值
            } else {
                tm.put(chs[i], tm.get(chs[i]) + 1);  //如果有该键,则获取该键对应的值然后+1
            }

            //其他方法
//            Integer values =tm.get(chs[i]);  //获取values
//            if (values!=null){            //判断values 是否为空
//                num=values+1;             如果不为空,则+1
//            }else {
//                num++;
//            }
//            tm.put(chs[i],num);
//            num=0;
        }

        StringBuilder sb=new StringBuilder(); //定义StringBuilder 储存数据

        Set<Character> ketSet = tm.keySet();
        Iterator<Character> it = ketSet.iterator();

        while (it.hasNext()) {
            Character c = it.next();
            Integer i = tm.get(c);

            //System.out.print(c+"("+i+")");

            sb.append(c+"("+i+")");
        }
        return sb.toString();   //返回字符串
    }
}

Map集合拓展,循环嵌套(一对多)

学校—教室—学生 存在映射关系
将学校看成一个集合 里面存储着每个教室
而教室也可以看成一个集合, 存储着每个学生

这样就是集合中存放集合

import java.util.*;  //导入集合类包

class Student {
    private String ID;
    private String name;

    public int hashCode() {
        return ID.hashCode();
    }

    Student(String ID, String name) {
        this.name = name;
        this.ID = ID;
    }

    public String toString() {  //自定义字符串
        return ID + ":::" + name;
    }
}

public class DEMO {
    public static void main(String[] args) {

        Map<String, List<Student>> school = new HashMap<>();   // 学校为Map集合,

        List<Student> class1 = new ArrayList<>();             //班级也为集合,存放学生对象
        class1.add(new Student("01", "zhangsan"));
        class1.add(new Student("02", "lisi"));
        class1.add(new Student("03", "chener"));

        List<Student> class2 = new ArrayList<>();
        class2.add(new Student("01", "wangwu"));
        class2.add(new Student("02", "goudan"));
        class2.add(new Student("03", "qinhan"));

        school.put("一班", class1);    //将班级名字作为Key,班级对象作为Values存入Map集合中
        school.put("二班", class2);

        getInfos(school);  //使用自定义功能打印学校的学生信息


    }

    public static void getInfos(Map<String, List<Student>> school) {  //定义一个打印学校 学生信息的功能

//        Set<String> keySet = school.keySet();   //使用keySet();
//        Iterator<String> it = keySet.iterator();   //获取keySet迭代器遍历 Key
//        while (it.hasNext()) {
//            String className = it.next();      //获取班级名字
//            System.out.println(className);     //打印班级名字
//            List<Student> al = school.get(className);    //根据Key  ,获取Student 对象

 //---------------------------------------  两种方法---------------------------------------

        Set<Map.Entry<String,List<Student>>> entrySet=school.entrySet();    //使用entrySet方法

        Iterator<Map.Entry<String,List<Student>>> it=entrySet.iterator();    //获取迭代器遍历Map.Entry类型对象
        while (it.hasNext()){

            Map.Entry<String,List<Student>> me=it.next();    //获取Map.Entry类型对象

            String className =me.getKey();                  //获取班级名字
            System.out.println(className);                  //打印班级名字

            List<Student> al=me.getValue();                 //获取班级集合

            Iterator<Student> it1 = al.iterator();       //获取班级集合的迭代器遍历学生对象
            while (it1.hasNext()) {

                Student s = it1.next();        //获取学生对象
                System.out.println(s);        //打印学生信息
            }

        }
    }
    public static void sop(Object obj) {
        System.out.println(obj);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值