Map系列集合

news2024/11/15 20:01:59

1.Map集合

1.1Map集合概述和特点

Map集合概述

interface Map<K,V>  K:键的类型;V:值的类型

  • Map集合的特点

    • 双列集合,一个键对应一个值

    • 键不可以重复,值可以重复

Map集合的基本使用

public class MapDemo01 {
    public static void main(String[] args) {
        //创建集合对象
        Map<String,String> map = new HashMap<String,String>();

        //V put(K key, V value) 将指定的值与该映射中的指定键相关联
        map.put("itheima001","林青霞");
        map.put("itheima002","张曼玉");
        map.put("itheima003","王祖贤");
        map.put("itheima003","柳岩");

        //输出集合对象
        System.out.println(map);
    }
}

发现有二个itheima003,之前说过键和值是一 一对应关系,且键不可以重复,值可以重复

itheima003(键)重复了,所以没有打印出来,从上到下覆盖

1.2Map集合的基本功能

方法介绍

方法名说明
V put(K key,V value)添加元素
V remove(Object key)根据键删除键值对元素
void clear()移除所有的键值对元素
boolean containsKey(Object key)判断集合是否包含指定的键
boolean containsValue(Object value)判断集合是否包含指定的值
boolean isEmpty()判断集合是否为空
int size()集合的长度,也就是集合中键值对的个数

package Map;

import java.util.HashMap;
import java.util.Map;

/*
  put(K key,V   value)                | 添加元素                             |
| remove(Object key)                  | 根据键删除键值对元素                 |
| void   clear()                      | 移除所有的键值对元素                 |
| boolean containsKey(Object key)     | 判断集合是否包含指定的键             |
| boolean containsValue(Object value) | 判断集合是否包含指定的值             |
| boolean isEmpty()                   | 判断集合是否为空                     |
| int size()                          | 集合的长度,也就是集合中键值对的个数 |
 */
public class demo2 {
    public static void main(String[] args) {
        //创建集合对象
        Map<String, String> map = new HashMap<>();
        //V put(K key,V value):添加元素
        map.put("张无忌", "赵敏");
        map.put("郭靖", "黄蓉");
        map.put("杨过", "张三");
        String value1 = map.put("杨过", "小龙女");
        //2.添加元素
        //put方法的细节:
        //添加/覆盖
        //在添加数据的时候,如果键不存在,那么直接把键值对对象添加到map集合当中,方法返回null
        //在添加数据的时候,如果键是存在的,那么会把原有的键值对对象覆盖,会把被覆盖的值进行返回。
        System.out.println(value1);//如果键是存在的,那么会把原有的键值对对象覆盖,会把被覆盖的值进行返回。
        String value2 = map.put("王五", "小龙女");
        System.out.println(value2);//null 如果键不存在,那么直接把键值对对象添加到map集合当中,方法返回null

        //删除
        boolean result = map.remove("郭靖", "黄蓉");
        System.out.println(result);
        //清空
        //map.clear();

        //判断是否包含
        boolean keyresult = map.containsKey("郭靖");
        System.out.println(keyresult);

        boolean valueresult = map.containsValue("小龙女");
        System.out.println(valueresult);
        int size = map.size();
        System.out.println(size);

        //3.打印集合
        System.out.println(map);


    }
}

1.3Map集合的获取功能

方法介绍

方法名说明
V get(Object key)根据键获取值
Set<K> keySet()获取所有键的集合
Collection<V> values()获取所有值的集合
Set<Map.Entry<K,V>> entrySet()获取所有键值对对象的集合

方法1(遍历)

把所有的键存储再单列集合里面,然后通过键找到与之对应的值,通过get方法获取值即可 

  • 遍历思路

    • 我们刚才存储的元素都是成对出现的,所以我们把Map看成是一个夫妻对的集合

      • 把所有的丈夫给集中起来

      • 遍历丈夫的集合,获取到每一个丈夫

      • 根据丈夫去找对应的妻子

  • 步骤分析

    • 获取所有键的集合。用keySet()方法实现

    • 遍历键的集合,获取到每一个键。用增强for实现

      • 根据键去找值。用get(Object key)方法实现

 

package Map;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class demo3 {
    public static void main(String[] args) {
        //map的第一种遍历方式
        //1.创建map集合对象
        Map<String, String> map = new HashMap<>();
        map.put("张无忌", "赵敏");
        map.put("郭靖", "黄蓉");
        map.put("杨过", "小龙女");
        //2.通过键找值
        //2.1 获取所有的键,把这些键放入单列集合当中
        Set<String> keySet = map.keySet();
        //2.2遍历单列集合,得到每一个键;
        for (String s : keySet) {
            //System.out.println(s);
            //2.3 利用Map集合中的键获取对应的值 Get
            String value = map.get(s);
            System.out.println(s + "=" + value);
        }
    }
}

方法2(遍历)

  • 遍历思路

    • 我们刚才存储的元素都是成对出现的,所以我们把Map看成是一个夫妻对的集合

      • 获取所有结婚证的集合

      • 遍历结婚证的集合,得到每一个结婚证

      • 根据结婚证获取丈夫和妻子

  • 步骤分析

    • 获取所有键值对对象的集合

      • Set<Map.Entry<K,V>> entrySet():获取所有键值对对象的集合

      • 遍历键值对对象的集合,得到每一个键值对对象

        • 用增强for实现,得到每一个Map.Entry

    • 根据键值对对象获取键和值

      • 用getKey()得到键

      • 用getValue()得到值

 

获取getkey方法和getvalue方法

//通过键值对对象进行遍历
//3.1通过一个方法获取所有的键值对对象 ,返回一个Set集合
//获取getkey方法和getvalue方法即可
Set<Map.Entry<String, String>> entries = m.entrySet();
//3.2遍历entries这个集合,去得到里面的每一个键值对对象

 第二种方法的lambda表达式

package Map;

import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

public class demo4 {
    public static void main(String[] args) {
        //map的第二种遍历方式
        Map<String, String> m = new HashMap<>();
        m.put("张无忌", "赵敏");
        m.put("郭靖", "黄蓉");
        m.put("杨过", "小龙女");
        //通过键值对对象进行遍历
        //3.1通过一个方法获取所有的键值对对象 ,返回一个Set集合
        //获取getkey方法和getvalue方法即可
        Set<Map.Entry<String, String>> entries = m.entrySet();
        //3.2遍历entries这个集合,去得到里面的每一个键值对对象
        //1.增强for
        /*for (Map.Entry<String, String> entry : entries) {
            System.out.println(entry.getKey() + "=" + entry.getValue());
        }*/
 //entry 第一次循环的时候代表的是张无忌", "赵敏这个键值对对象,以此类推
        //迭代器
        /*Iterator<String> it= m.keySet().iterator();
        while(it.hasNext()){
            String key = it.next();
            String value = m.get(key);
            System.out.println(key+"="+value);
        }*/

        //lambda表达式
  //方法的底层其实就是利用增强for进行遍历,依次得到每一个键和值
        //再调用accept方法
        m.forEach(( s1,  s2)-> System.out.println(s1+"="+s2));

    }
}

2.HashMap集合

2.1HashMap集合概述和特点

  • HashMap底层是哈希表结构的

  • 依赖hashCode方法和equals方法保证键的唯一

  • 如果键要存储的是自定义对象,需要重写hashCode和equals方法

练习1

package HashMap;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;

public class demo1 {
    public static void main(String[] args) {
        HashMap<Student, String> m = new HashMap<>();
        Student s1 = new Student("张三", 18);
        Student s2 = new Student("李四", 20);
        Student s3 = new Student("王五", 19);
        m.put(s1, "湖北省");
        m.put(s2, "重庆");
        m.put(s3, "江苏省");
       /* //获取迭代器对象
        //迭代器对象好比是一个指针,默认指向集合的0索引处
        Iterator<Student> it = m.keySet().iterator();
        // 利用循环不断的去获取集合中的每一个元素
        while (it.hasNext()) {
            //next方法的二件事情:获取指针指向的元素并且移动指针
            Student key = it.next();//键
            String value = m.get(key);//值
            System.out.println(key + "\t" + value);
        }*/

       /* //增强for方法1
        //先获取所有键的对象
        Set<Student> keys = m.keySet();//遍历单列集合,得到每一个键;
        for (Student key : keys) {
            String value = m.get(key);//根据键去找值
         System.out.println(key + "\t" + value);
        }*/
        //增强for方法2
        for (Map.Entry<Student, String> entry : m.entrySet()) {//获取所有键值对对象的集合
            //遍历键值对对象的集合,得到每一个键值对对象--entry
            Student key = entry.getKey();//利用entry对象去获取键
            String value = entry.getValue();//利用entry对象去获取值
            System.out.println(key + "\t" + value);
        }

    }
}

因为要求是说的键,键存储的是自定义对象,所以要重写方法 

package HashMap;

import java.util.Objects;

public class Student {
    private String name;
    private int age;

    public Student() {
    }

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

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

练习2

package HashMap;

import java.util.*;

public class demo2 {
    public static void main(String[] args) {
        //定义一个数组存储景点
        String[] arr = {"A", "B", "C", "D"};
        //创建一个集合存储学生投票选择的景点
        ArrayList<String> list = new ArrayList<>();

        Random r = new Random();
        for (int i = 0; i < 80; i++) {
            int index = r.nextInt(arr.length);
            //把学生随机投的票存入集合当中
            list.add(arr[index]);
        }
        //利用map集合统计景点次数
        HashMap<String, Integer> map = new HashMap<>();
        for (String s : list) {
            //map集合里面存在学生头的景点
            boolean containsKey = map.containsKey(s);
            int count = 0;
            //判断map集合里面是否包含该景点
            if (containsKey) {
                //存在count++;
                //先获取当前景点已经被投了多少次数
                count = map.get(s);
                //当前景点又被投了一次
                count++;
                //把当前景点加新的次数再次添加到map集合当中
                map.put(s, count);

            } else {
                //不存在count为1
                map.put(s, 1);
            }

        }
        //求次数最多的景点
        int max=0;
        Set<Map.Entry<String, Integer>> entries = map.entrySet();
        for (Map.Entry<String, Integer> entry : entries) {
            String key = entry.getKey();
            int count = entry.getValue();
            if(count>max){
                max=count;
            }
            System.out.println(key+":"+count);

        }
        //判断哪个景点的次数跟最大值一样,一样就打印出来
        for (Map.Entry<String, Integer> entry : entries) {
            String key = entry.getKey();
            int count = entry.getValue();
            if(count==max){
                System.out.println(key);
            }

        }
        
    }
}

3.LinkedHashMap集合

package LinkedHashMap;

import java.util.LinkedHashMap;

public class demo1 {
    public static void main(String[] args) {
  /*
           LinkedHashMap:
               由键决定:
                   有序、不重复、无索引。
               有序:
                   保证存储和取出的顺序一致
               原理:
                   底层数据结构是依然哈希表,只是每个键值对元素又额外的多了一个双链表的机制记录存储的顺序。
         */
        LinkedHashMap<String, Integer> lhm = new LinkedHashMap<>();
        lhm.put("c", 001);
        lhm.put("b", 002);
        lhm.put("a", 001);
        System.out.println(lhm);
        //存取顺序一致
    }
}

4.TreeMap集合

package TreeMap;
import java.util.Set;
import java.util.TreeMap;

public class demo1 {
    public static void main(String[] args) {
    //            采取第二种排序方式:比较器排序  因为第一种方法是默认升序,所以不能满足需求
        //Integer Double 默认情况下都是按照升序排列的
        //String 按照字母再ASCII码表中对应的数字升序进行排列
        TreeMap<Integer, String> tm1 = new TreeMap<>((o1, o2) -> o1 - o2);
        //o1是当前要添加的元素,
        //o2表示红黑树中存在的元素
        tm1.put(1, "可乐");
        tm1.put(3, "雪碧");
        tm1.put(2, "红牛");
        //要求1 按照id的升序排列;
        method01(tm1);
        System.out.println("-----------");
        //要求2 按照id降序排列
        TreeMap<Integer, String> tm2 = new TreeMap<>((o1, o2) -> o2 - o1);
        tm2.put(1, "可乐");
        tm2.put(3, "雪碧");
        tm2.put(2, "红牛");
        method01(tm2);
    }

    private static void method01(TreeMap<Integer, String> tm) {
        //获取所有的键,并存入单列集合当中
        Set<Integer> keys = tm.keySet();
        //遍历单列集合,得到每一个键(id) 升序
        for (Integer key : keys) {
            String value = tm.get(key);
            System.out.println(key+"--"+value);
        }
    }
}

   @Override
    public int compareTo(Student o) {
        //要求: 按照学生的年龄排序,年龄一样按照姓名和字母排序,同姓名和年龄视为同一个人
//this表示当前要添加的元素
//o表示红黑树存在的元素
//返回值:
//负数: 认为要添加的元素在左边
//正数:认为要添加的元素在右边
//0:认为要添加的元素存在,舍弃
        int tmp=this.getAge()-o.getAge();
        tmp= tmp==0? this.getName().compareTo(o.getName()):tmp;
        return tmp;
    }
package TreeMap;

import java.util.TreeMap;

public class demo2 {
    public static void main(String[] args) {
        Student s1 = new Student("zhangsan", 18);
        Student s2 = new Student("lisi", 17);
        Student s3 = new Student("wangwu", 20);
        TreeMap<Student, String> tm = new TreeMap<>();
        tm.put(s1, "湖北省");
        tm.put(s3, "广东省");
        tm.put(s2, "江苏省");
        //要求: 按照学生的年龄排序,年龄一样按照姓名和字母排序,同姓名和年龄视为同一个人
        System.out.println(tm);


    }
}

package TreeMap;

import java.util.*;
  //利用map集合来添加字符出现的次数
        /*
        新的统计思想,如果题目没有要求对结果排序默认使用HaShMap
        如果有排序就使用TreeMap 因为 a(5) b(4) c(3) d(2) e(1)按照Ascll码值排好了
         */
public class demo3 {
    public static void main(String[] args) {
      String str="aababcabcdabcde";
        char[] arr = str.toCharArray();
        ArrayList<Character> list = new ArrayList<>();
        for (int i = 0; i < arr.length; i++) {
            list.add(arr[i]);
        }
        //利用map集合来添加字符出现的次数
        TreeMap<Character, Integer> tm = new TreeMap<>();
        for (char s : list) {//遍历每一个键
            //判断tm集合里面是否存在字符
            if (tm.containsKey(s)) {
                //存在count++;
                int count = 0;
                //先获取当前字符已经出现了多少次数
                count = tm.get(s);
                //当前字符又出现一次
                count++;
                tm.put(s, count);
            } else {
                //不存在count为1
                tm.put(s, 1);
            }
        }
        Set<Map.Entry<Character, Integer>> entries = tm.entrySet();
        for (Map.Entry<Character, Integer> entry : entries) {
            char key = entry.getKey();
            int value = entry.getValue();
            System.out.print(key +"("+ value+")"+" ");
        }
    }
}
 TreeMap<Character, Integer> tm = new TreeMap<>();
        for (int i = 0; i < str.length(); i++) {
            char s = str.charAt(i);//得到每一个键(字符)
            //判断tm集合里面是否存在字符
            if (tm.containsKey(s)) {
                //存在count++;
                int count = 0;
                //先获取当前字符已经出现了多少次数
                count = tm.get(s);
                //当前字符又出现一次
                count++;
                tm.put(s, count);
            } else {
                //不存在count为1
                tm.put(s, 1);
            }
        }

什么叫不能满足默认排序规则

如:需要要降序,或者按照字符长度来排序等,这种情况才使用第二种排序规则

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1928648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器数据恢复—raid5阵列热备盘同步失败导致lun不可用的数据恢复案例

服务器存储数据恢复环境&#xff1a; 华为S5300存储中有一组由16块FC硬盘组建的RAID5磁盘阵列&#xff08;包含一块热备盘&#xff09;。 服务器存储故障&#xff1a; 该存储中的RAID5阵列1块硬盘由于未知原因离线&#xff0c;热备盘上线并开始同步数据&#xff0c;数据同步到…

QSpice-(5) .model使用

QSpice-(5) .model使用 Uu们&#xff0c;晚上好&#xff01; 众所周知&#xff0c;Qspice里面的模型非常少&#xff0c;基本上是光秃秃的&#xff0c;想要搞二极管还需要自己去找二极管的模型&#xff0c;但找到模型怎么导进去呢&#xff1f; First one,咱们先放置一个Dio…

数据结构--二叉树遍历

目录 1.介绍 &#xff08;1&#xff09;前序遍历 &#xff08;2&#xff09;定义结构体 &#xff08;3&#xff09;前序遍历实现 &#xff08;4&#xff09;中序遍历实现 &#xff08;5&#xff09;二叉树的节点个数 &#xff08;6&#xff09;二叉树树叶节点个数 &…

写python代码,怎么用工厂模式思维设计接口?

接口的好处 接口就是抽象方法&#xff0c;用来设计后架构&#xff0c;后端开发者和客户端调用者都可以使用这个接口规则同步写代码&#xff0c;客户端调用者&#xff08;app、网页甚至时自动化接口测试&#xff09;不用担心后端对接口的实现细节具体是什么样子的。直接去调用就…

多旋翼+VR眼镜:10寸FPV穿越机技术详解

FPV&#xff08;First Person View&#xff09;穿越机&#xff0c;是指通过第一人称视角来驾驶的无人机&#xff0c;特别强调速度和灵活性&#xff0c;常常用于竞赛、航拍和探索等领域。结合多旋翼设计和VR眼镜&#xff0c;FPV穿越机为用户提供了身临其境的飞行体验。 多旋翼技…

CH552G使用IAP下载

常见下载中的方式ISP&#xff0c;IAP&#xff0c;ICP 参考&#xff0c;CH552G中文手册&#xff0c;参考1 ISP&#xff1a;In System Programing&#xff0c;在系统编程。是常见的&#xff0c;使用软件&#xff0c;先将某个引脚&#xff08;例如boot&#xff09;连接到合适的电…

极狐Gitlab使用(2)

目录 1. Gitlab命令行修改管理员密码 2. Gitlab服务管理 3. 公司的开发代码提交处理流程 4. Gitlab 备份与恢复 数据备份 测试数据恢复 5. 邮箱配置 1. Gitlab命令行修改管理员密码 [roottty01 ~]# gitlab-rails console -e production # 启动GitLab的Rails控制…

白平衡说明

白平衡 相机白平衡的起源原理以及作用起源作用 白平衡的原理白平衡的类型应用说明 工业相机的白平衡效果对比一键白平衡的必要性一键白平衡的实现方式 相机白平衡的起源原理以及作用 起源 白平衡&#xff08;White Balance, WB&#xff09;概念的起源与色温理论密切相关。色温…

Open3D 点云区域生长分割算法

目录 一、基本原理 二、代码实现 三、实现效果 3.1原始点云 3.2分割后点云 前期试读&#xff0c;后续会将博客加入该专栏&#xff0c;欢迎订阅Open3D与点云深度学习的应用_白葵新的博客-CSDN博客 一、基本原理 Open3D 的点云区域生长分割算法是一种基于区域生长的点云分割…

SpringBoot实战:密码处理

Controller层 Operation(summary "保存或更新后台用户信息") PostMapping("saveOrUpdate") public Result saveOrUpdate(RequestBody SystemUser systemUser) {if(systemUser.getPassword() ! null){systemUser.setPassword(DigestUtils.md5Hex(systemUs…

单链表的介绍和实现

前言 Hello,小伙伴们&#xff0c;你们的作者君又回来了&#xff0c;今天我将带领大家继续学习另一种线性表&#xff1a;单链表&#xff0c; 准备好的小伙伴三连打卡上车&#xff0c;你们的支持就是我更新的动力&#xff0c;一定不要吝啬手中的三连哟&#xff0c;万分感谢&…

微服务实战系列之玩转Docker(一)

前言 话说计算机的“小型化”发展&#xff0c;历经了大型机、中型机直至微型机&#xff0c;贯穿了整个20世纪的下半叶。同样&#xff0c;伴随着计算机的各个发展阶段&#xff0c;如何做到“资源共享、资源节约”&#xff0c;也一直是一代又一代计算机人的不懈追求和历史使命。今…

cleanshot Mac 上的截图工具

笔者闲来无事&#xff0c;最近在找一些mac上好用的工具其中一款就是cleanShot。为什么不用原有的mac自带的呢。因为相对来说编辑功能不算全面&#xff0c;不支持长截图。那有没有一款软件支持关于截图的好用工具呢。 所以笔者找了这款。安装包是直接安装就可使用的。请大家点赞…

校验el-table中表单项

需求&#xff1a; 表格中每一行都有几个必填项&#xff0c;如用户提交时有未填的选项&#xff0c;将该选项标红且给出提示&#xff0c;类似el-form 的那种校验 el-table本身并没有校验的方法&#xff0c;而且每一行的输入框也是通过插槽来实现的&#xff0c;因此我们要自己跟…

VUE前端HTML静默打印(不弹出打印对话框)PDF简单方案

前言 在做打印功能的时候&#xff0c;以前大部分客户端都是用C#做的&#xff0c;静默打印&#xff08;也就是不弹出打印对话框&#xff09;比较简单。 但是使用浏览器作为客户端&#xff0c;静默打印&#xff08;也就是不弹出打印对话框&#xff09;做起来就比较困难。困难的…

LLM-阿里 DashVector + langchain self-querying retriever 优化 RAG 实践【Query 优化】

文章目录 前言self querying 简介代码实现总结 前言 现在比较流行的 RAG 检索就是通过大模型 embedding 算法将数据嵌入向量数据库中&#xff0c;然后在将用户的查询向量化&#xff0c;从向量数据库中召回相似性数据&#xff0c;构造成 context template, 放到 LLM 中进行查询…

css - - - - - 去除图片默认的白色背景(混合模式 mix-blend-mode)

去除图片默认的白色背景&#xff08;mix-blend-mode&#xff09; 1. 需求描述2. 原图展示3. 原代码展示4. 使用混合模式(mix-blend-mode)5.修改后效果 1. 需求描述 图片含有白色地图&#xff0c;想要将其去掉 2. 原图展示 3. 原代码展示 <div><img src*****/> &…

基于高德地图实现Android定位功能实现(二)

基于高德地图实现Android定位功能实现&#xff08;二&#xff09; 在实现的高德地图的基本显示后&#xff0c;我们需要不断完善地图的功能 地图界面设计&#xff08;悬浮按钮等&#xff09; 首先就是地图页面的布局&#xff0c;这个根据大家的实际需求进行设计即可&#xff…

无人机图像目标检测

本仓库是人工智能课程的课程作业仓库&#xff0c;主要是完成无人机图像目标检测的任务&#xff0c;我们对visdrone数据集进行了处理&#xff0c;在yolo和ssd两种框架下进行了训练和测试&#xff0c;并编写demo用于实时的无人机图像目标检测。 requirements依赖&#xff1a; ss…

数据结构之‘串’

目录 一. 串的定义二. 串的基本操作三. 串的存储结构3.1 顺序存储3.2 链式存储3.3 基于顺序存储的基本操作 \quad 一. 串的定义 \quad \quad \quad \quad 二. 串的基本操作 \quad \quad 三. 串的存储结构 \quad \quad 3.1 顺序存储 \quad 得一个一个遍历 结合方案一和方案二的优…