Map集合的使用

Map是一种键-值对(key-value)集合,在jdk1.8之后,它的结构由数组+链表,或者是数组+红黑树组成.

在Map接口中,有两个主要集合HashMap和TreeMap.

HashMap

存储数据的特点是:无序,唯一;这里的唯一是指key值唯一,value值可以重复.

Map 集合最典型的用法就是成对地添加、删除 key-value.

TreeMap

存储数据的特点是:唯一且有序的,一般是按升序的方式排列

实现要求:实现comparable接口,并且重写compareTo的方法用来实现它的排序

例子1

使用map,在控制台输入一串字符串,统计字符串中每个字符出现的次数,并按照次数的降序进行排序

public static void main(String[] args) {

    //创建HashMap,key值为char类型,value用来记录次数,int型
        Map<Character,Integer> map = new HashMap<>();

        Scanner input = new Scanner(System.in);
        System.out.println("请输入一段字符串");

        String str = input.nextLine();

    //不用变为数组,底层就是char[]
    for (int i = 0; i <str.length() ; i++) {
            char ch = str.charAt(i);
            //判断map中是否存在该字符
            if(map.containsKey(ch)){

        //map.put()添加,如果key相同,覆盖之前的value map.put(ch,map.get(ch) + 1); }else{ map.put(ch,1); }

先遍历字符串,得到每个字符,在判断map中是否存在该字符,如果存在,使用put()方法来添加,得到value值再加1;如果不存在,添加该字符,value初始值为1.

下面进行排序,我们知道,TreeMap只能根据key来排序,不能根据value来排序的.所以用TreeMap来排序显然不符合这题意的要求,下面介绍TreeSet,它可以指定值来自定义排序

TreeSet

与TreeMap相同,要求实现Comparable接口,并且重写compareTo的方法.下面用TreeSet来进行排序,把Map集合转为Set集合

//转换 
 Set<Map.Entry<Character, Integer>> entries = map.entrySet();

//使用TreeSet排序    1.实现Comparator接口
  TreeSet treeSet = new TreeSet(new Comparator<Map.Entry<Character, Integer>>() {
        //2.重写CompareTo方法
            @Override
            public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {
        //得到map集合的value值 ,如果两个字符的value值相同,返回1或-1是都可以
                if(o2.getValue() == o1.getValue()){
                      return 1;
                }
        //降序
                return o2.getValue() - o1.getValue();
            }
        });    

 

例子2

使用 HashMap来存储学生信息,属性有学号,和姓名,根据学号进行删除操作。

首先分析,key值是唯一的,所以用学号来做key.

  public static void main(String[] args) {
         Map<String,String> users = new HashMap<>();
        users.put("11", "张三"); 
        users.put("22", "李四");
        users.put("33", "王五");
Scanner input = new Scanner(System.in);
        System.out.println("请输入要删除的学号:");
        int num = input.nextInt();
        if (users.containsKey(String.valueOf(num))) { // 判断是否包含指定学号
            users.remove(String.valueOf(num)); // 如果包含就删除
        } else {
            System.out.println("该学生不存在!");
        }
使用containsKey()先判断是否包含此学生的学号, remove() 方法将对应的元素删除
//转为set集合,再使用迭代器
Iterator it = users.keySet().iterator();
        while (it.hasNext()) {
            // 遍历 Map
            Object key = it.next();
            Object value = users.get(key);
            System.out.println("学号:" + key + ",姓名:" + value);
        }

遍历Map集合,这里用到的是迭代器;jdk专门提供的迭代器用于遍历Collection接口的集合,主要用于List,Set集合,将map转换为set集合,

使用map.get()方法,获得对应key的value值,最后输出删除后的学生

posted @ 2022-08-10 12:03  Tmillion  阅读(818)  评论(0编辑  收藏  举报