Map系列集合

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集合中的键获取对应的值 GetString 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方法2for (Map.Entry<Student, String> entry : m.entrySet()) {//获取所有键值对对象的集合//遍历键值对对象的集合,得到每一个键值对对象--entryStudent 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 + "}";}@Overridepublic 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);}@Overridepublic 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为1map.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);}}
}

   @Overridepublic 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为1tm.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为1tm.put(s, 1);}}

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

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

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

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

相关文章

防火墙NAT实验

一.实验拓扑 二.实验要求 1.办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 2.分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 3.多出口环境基于带宽比例进行选路&#xff0c;但是&#xff0c…

神经网络 | Transformer 基本原理

目录 1 为什么使用 Transformer&#xff1f;2 Attention 注意力机制2.1 什么是 Q、K、V 矩阵&#xff1f;2.2 Attention Value 计算流程2.3 Self-Attention 自注意力机制2.3 Multi-Head Attention 多头注意力机制 3 Transformer 模型架构3.1 Positional Encoding 位置编…

《梦醒蝶飞:释放Excel函数与公式的力量》12.1 DSUM函数

第12章&#xff1a;数据库函数 第一节 12.1 DSUM函数 12.1.1 简介 DSUM函数是Excel中的一个数据库函数&#xff0c;用于计算数据库或数据表中特定条件下某字段的总和。DSUM函数在处理大规模数据、数据筛选和分析时非常有用。 12.1.2 语法 DSUM(database, field, criteria)…

【学术会议征稿】第三届智能电网与能源系统国际学术会议

第三届智能电网与能源系统国际学术会议 2024 3rd International Conference on Smart Grid and Energy Systems 第三届智能电网与能源系统国际学术会议&#xff08;SGES 2024&#xff09;将于2024年10月25日-27日在郑州召开。 智能电网可以优化能源布局&#xff0c;让现有能源…

大模型LLM 应用私有化部署项目

LLM 参数包含数十亿甚至万亿级的架构复杂&#xff0c;训练和推理涉及大量计算资源。企业客户训练资料少&#xff0c;在实际应用中可能表现出检索幻觉、精准度差&#xff0c;同时也带来了性能、安全性和效率等方面的挑战。 ChatGPT、LLaMa、Bard 等大语言模型(LLMs)取得了非常巨…

【python】基于决策树的语音识别

目录 引言 决策树的主要特点 决策树的构建过程 决策树的应用 数据集 代码实现 引言 决策树&#xff08;Decision Tree&#xff09;是一种常用的分类与回归方法&#xff0c;其中最为人所知的是其在分类问题上的应用。决策树模型呈树形结构&#xff0c;其中每个内部节点表…

python数据可视化(5)——绘制饼图

课程学习来源&#xff1a;b站up&#xff1a;【蚂蚁学python】 【课程链接&#xff1a;【【数据可视化】Python数据图表可视化入门到实战】】 【课程资料链接&#xff1a;【链接】】 Python绘制饼图分析北京天气 饼图&#xff0c;是一个划分为几个扇形的圆形统计图表&#xff…

基于全国产复旦微JFM7K325T+ARM人工智能数据处理平台

复旦微可以配合的ARM平台有&#xff1a;RK3588/TI AM62X/ NXP IMX.8P/飞腾FT2000等。 产品概述 基于PCIE总线架构的高性能数据预处理FMC载板&#xff0c;板卡采用复旦微的JFM7K325T FPGA作为实时处理器&#xff0c;实现各个接口之间的互联。该板卡可以实现100%国产化。 板卡具…

华为模拟器防火墙配置实验(二)

一.实验拓扑 二.实验要求 1&#xff0c;DMZ区内的服务器&#xff0c;办公区仅能在办公时间内&#xff08;9&#xff1a;00 - 18&#xff1a;00&#xff09;可以访问&#xff0c;生产区的设备全天可以访问. 2&#xff0c;生产区不允许访问互联网&#xff0c;办公区和游客区允许…

240712_昇思学习打卡-Day24-LSTM+CRF序列标注(3)

240712_昇思学习打卡-Day24-LSTMCRF序列标注&#xff08;3&#xff09; 今天做LSTMCRF序列标注第三部分&#xff0c;同样&#xff0c;仅作简单记录及注释&#xff0c;最近确实太忙了。 Viterbi算法 在完成前向训练部分后&#xff0c;需要实现解码部分。这里我们选择适合求解…

从“Hello,World”谈起(C++入门)

前言 c的发展史及c能干什么不能干什么不是我们今天的重点&#xff0c;不在这里展开&#xff0c;有兴趣的朋友可以自行查阅相关资料。今天我们主要是围绕c的入门程序&#xff0c;写一个“hello&#xff0c;world”&#xff0c;并且围绕这个入门程序简单介绍一下c和c的一些语法&…

C++ Qt 自制开源科学计算器

C Qt 自制开源科学计算器 项目地址 软件下载地址 目录 0. 效果预览1. 数据库准备2. 按键&快捷键说明3. 颜色切换功能(初版)4. 未来开发展望5. 联系邮箱 0. 效果预览 普通计算模式效果如下&#xff1a; 科学计算模式效果如下&#xff1a; 更具体的功能演示视频见如下链接…

stm32入门-----初识stm32

目录 前言 ARM stm32 1.stm32家族 2.stm32的外设资源 3.命名规则 4.系统结构 ​编辑 5.引脚定义 6.启动配置 7.STM32F103C8T6芯片 8.STM32F103C8T6芯片原理图与最小系统电路 前言 已经很久没跟新了&#xff0c;上次发文的时候是好几个月之前了&#xff0c;现在我是想去…

论文分享|NeurIPS2022‘华盛顿大学|俄罗斯套娃表示学习(OpenAI使用的文本表示学习技术)

论文题目&#xff1a;Matryoshka Representation Learning 来源&#xff1a;NeurIPS2022/华盛顿大学谷歌 方向&#xff1a;表示学习 开源地址&#xff1a;https://github.com/RAIVNLab/MRL 摘要 学习表征对于现代机器学习很重要&#xff0c;广泛用于很多下游任务。大多数情…

java配置nginx网络安全,防止国外ip访问,自动添加黑名单,需手动重新加载nginx

通过访问日志自动添加国外ip黑名单 创建一个类&#xff0c;自己添加一个main启动类即可测试 import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.json.JSONArray; import org.json.JSONObject; import org.sp…

面试经验之谈

优质博文&#xff1a;IT-BLOG-CN ​通常面试官会把每一轮面试分为三个环节&#xff1a;① 行为面试 ② 技术面试 ③ 应聘者提问 行为面试环节 面试开始的5~10分钟通常是行为面试的时间&#xff0c;面试官会参照简历和你的自我介绍了解应聘者的过往经验和项目经历。由于面试官…

nodejs模板引擎(一)

在 Node.js 中使用模板引擎可以让您更轻松地生成动态 HTML 页面&#xff0c;通过将静态模板与动态数据结合&#xff0c;您可以创建可维护且易于扩展的 Web 应用程序。以下是一个使用 Express 框架和 EJS 模板引擎的基本示例&#xff1a; 安装必要的依赖&#xff1a; 首先&#…

分享浏览器被hao123网页劫持,去除劫持的方式

昨天看python相关的自动化工作代码时&#xff0c;发现谷歌浏览器被hao123劫持了&#xff0c;把那些程序删了也不管用 方法1&#xff1a;删除hao123注册表&#xff0c;这个方式不太好用&#xff0c;会找不到注册表 方法2&#xff1a;看浏览器快捷方式的属性页面&#xff0c;一…

【C++】入门基础(命名空间、缺省参数、函数重载)

目录 一.命名空间&#xff1a;namespace 1.namespace的价值 2.namespace的定义 3.namespace的使用方法 3.1 域解析运算符:: 3.2 using展开 3.3 using域解析运算符 二.输入输出 三.缺省参数 四.函数重载 1.参数类型不同 2.参数个数不同 3.参数顺序不同 一.命名空间&…

APP专项测试之网络测试

背景 当前app网络环境比较复杂&#xff0c;越来越多的公共wifi&#xff0c;网络制式有2G、3G、4G网络&#xff0c;会对用户使用app造成一定影响&#xff1b;当前app使用场景多变&#xff0c;如进地铁、上公交、进电梯等&#xff0c;使得弱网测试显得尤为重要&#xff1b; 网络正…