Java集合框架(三)---Map

news2024/9/20 20:33:35

接口Map<K,V>
Map集合:该集合存储键值对,一对一对往里存,而且要保证键的唯一性。
1,添加
put(K key, V value)
putAll(Map<? extends K, ? extends V> m)
2,删除
clear()
remove(Object key)
3,判断
containsValue(Object value)
containsKey(Object key)
isEmpty()
4,获取
get(Object key)
size()
values()
entrySet()
keySet()
Map
—Hashtable:底层是哈希数据结构,不可以存入null键null值,该集合是线程同步的。jdk1.0,效率低
—HashMap:底层是哈希表数据结构,允许使用null值和null键,该集合是不同步,jdk1.2效率高
—TreeMap:底层是二叉树数据结构,线程不同步,可以用于给Map结合中的键排序

和Set很像,其实Set底层就是使用了Map集合。

Map共性方法

public class Demo {
	public static void sop(Object object){
		System.out.println(object);
	}
	public static void main(String[] args) {
		
		 Map<String, String> map = new HashMap<String, String>();
		 //添加元素,如果出现添加时相同的键,那么后添加的值会覆盖原有键值对,并put方法会返回覆盖的值
		 map.put("01", "zhangsan1"); 
		 map.put("02", "zhangsan2");
		 map.put("03", null);
		 map.put("04", "zhangsan4");
		 
		 sop("containsKey = "+map.containsKey("01"));
		 sop("remove =  "+map.remove("02"));
		 //可以通过get方法的返回值来判断一个键是否存在,通过返回null来判断
		 sop("get = "+map.get("03"));
		 //获取map集合中所用的集合,是无序的
		 Collection<String> collection = map.values();
		sop(collection); 	
	}

打印结果:

containsKey = true
remove =  zhangsan2
get = null
[zhangsan4, zhangsan1, null]

Map-keySet

Set keySet:将Map中所有的键存入到Set集合,因为Set具备迭代器。所以可以迭代方式取出所有的键,在根据get方法,获取每一个键对应的值。

Map 集合的取出原理:将map集合转成Set集合,在通过迭代器取出。

public class Demo {
	public static void sop(Object object){
		System.out.println(object);
	}
	public static void main(String[] args) {
		 Map<String, String> map = new HashMap<String, String>();
		 map.put("01", "zhangsan1");
		 map.put("02", "zhangsan2");
		 map.put("03", "zhangsan3");
		 map.put("04", "zhangsan4");
		 //先获取Map集合的所有键的Set集合,keySet()
		 Set<String> keyset = map.keySet();
		 //有了Set集合,就可以获取其迭代器
		 Iterator<String> iterator = keyset.iterator();
		 while (iterator.hasNext()) {
			String string = (String) iterator.next();
			sop("key = "+string+", value = "+ map.get(string));
		}
	}

打印结果:

key = 04, value = zhangsan4
key = 01, value = zhangsan1
key = 02, value = zhangsan2
key = 03, value = zhangsan3

keyset原理图:
在这里插入图片描述
Map-entrySet

Set<Map.Entry<k,v> entrySet: 将map集合中的映射关系存入到了set集合中,而这个关系的数据类型就是Map.Entry

public class Demo {
	public static void sop(Object object){
		System.out.println(object);
	}
	public static void main(String[] args) {
		
		 Map<String, String> map = new HashMap<String, String>();
		 map.put("01", "zhangsan1");
		 map.put("02", "zhangsan2");
		 map.put("03", "zhangsan3");
		 map.put("04", "zhangsan4");
		 
		 Set<Map.Entry<String, String>> entries=  map.entrySet();
		 Iterator<Map.Entry<String, String>> iterator = entries.iterator();
		 while (iterator.hasNext()) {
			 Map.Entry<String, String> mEntry = iterator.next();
				String key = mEntry.getKey();
				String value = mEntry.getValue();
			 sop("key = "+key+", value = "+ value);
 		 }
	}

打印结果:

key = 04, value = zhangsan4
key = 01, value = zhangsan1
key = 02, value = zhangsan2
key = 03, value = zhangsan3

entrySet图例
在这里插入图片描述
Map.Entry 其实Entry也是一个接口,它是Map接口中的一个内部接口
在这里插入图片描述
Map练习
每一个学生都有对应的归属地,学生Student,地址String。
学生属性:姓名,年龄
注意:姓名和年龄相同的视为同一个学生,保证学生的唯一性。

1,描述学生
2,定义一个map容器,将学生作为键,地址作为值 存入
3,获取map集合的元素。

class Student implements Comparable<Student>{
	private String name;
	private int age;
	
	public Student(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public int getAge() {
		return age;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 * 一想到Hash集合就要想到HashCode和equals
	 */
	@Override
	public int hashCode() {
		return name.hashCode()+age*34;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
	
		if (!(obj instanceof Student)) {
			throw new ClassCastException("类型不匹配");
		}
		Student other = (Student) obj;
		
		return this.name.equals(other.name) && this.age == other.age;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	//数据有可能会存到二叉树中,所以还是要覆写上排序的方法
	@Override
	public int compareTo(Student o) {
		int num = new Integer(this.age).compareTo(new Integer(o.age));
		if (num == 0) {
			return this.name.compareTo(o.name);
		}
		return num;
	}
}

public class Demo {
	public static void sop(Object object){
		System.out.println(object);
	}
	public static void main(String[] args) {
		
		 HashMap<Student, String> map = new HashMap<Student, String>();
		 
		 map.put(new Student("zhangsan", 18), "beijing");
		 map.put(new Student("lisi", 33), "xian");
		 map.put(new Student("wangwu", 25), "shenzhen");
		 map.put(new Student("xiaoming", 23), "hebei");
		 map.put(new Student("xiaoming", 23), "shanghai");//会覆盖上面的值

		 //第一中方式取出
		 Set<Student> set = map.keySet();
		 Iterator<Student> iterator = set.iterator();
		 while (iterator.hasNext()) {
			Student student = iterator.next();
			String value = map.get(student);
			sop("student:"+student + " , value:"+ value);
		}
		 
		 //第二种取出方式
		 Set<Map.Entry<Student, String>> entries=  map.entrySet();
		 Iterator<Map.Entry<Student, String>> iterator1 = entries.iterator();
		 while (iterator1.hasNext()) {
			 Map.Entry<Student, String> mEntry = iterator1.next();
			 Student key = mEntry.getKey();
	 			String value = mEntry.getValue();
			 sop("key = "+key.toString()+", value = "+ value);
		 }
	}

打印结果:

student:Student [name=wangwu, age=25] , value:shenzhen
student:Student [name=zhangsan, age=18] , value:beijing
student:Student [name=xiaoming, age=23] , value:shanghai
student:Student [name=lisi, age=33] , value:xian
key = Student [name=wangwu, age=25], value = shenzhen
key = Student [name=zhangsan, age=18], value = beijing
key = Student [name=xiaoming, age=23], value = shanghai
key = Student [name=lisi, age=33], value = xian

TreeMap练习
需求:按照学生的姓名进行排序。
因为数据是以键值对形式存在的,所以要使用可以排序的map集合,TreeMap.

class Student implements Comparable<Student>{
	private String name;
	private int age;
	
	public Student(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public int getAge() {
		return age;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 * 一想到Hash集合就要想到HashCode和equals
	 */
	@Override
	public int hashCode() {
		return name.hashCode()+age*34;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
	
		if (!(obj instanceof Student)) {
			throw new ClassCastException("类型不匹配");
		}
		Student other = (Student) obj;
		
		return this.name.equals(other.name) && this.age == other.age;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	//数据有可能会存到二叉树中,所以还是要覆写上排序的方法
	//按照年龄排序
	@Override
	public int compareTo(Student o) {
		int num = new Integer(this.age).compareTo(new Integer(o.age));
		if (num == 0) {
			return this.name.compareTo(o.name);
		}
		return num;
	}
}
class StuComparator implements Comparator<Student>{

	@Override
	public int compare(Student o1, Student o2) {
	//按照年龄排序
		int num = o1.getName().compareTo(o2.getName());
		if (num == 0) {
			return new Integer(o1.getAge()).compareTo(o2.getAge());
		}
		return num;
	}
}

public class Demo {
	public static void sop(Object object){
		System.out.println(object);
	}
	public static void main(String[] args) {
		
		TreeMap<Student, String>  treeMap = new TreeMap<Student, String>(new StuComparator());
		
		treeMap.put(new Student("zhangsan", 18), "beijing");
		treeMap.put(new Student("lisi", 33), "xian");
		treeMap.put(new Student("wangwu", 25), "shenzhen");
		treeMap.put(new Student("xiaoming", 23), "hebei");
		treeMap.put(new Student("xiaoming", 23), "shanghai");

		 Set<Map.Entry<Student, String>> entries=  treeMap.entrySet();
		 Iterator<Map.Entry<Student, String>> iterator1 = entries.iterator();
		 while (iterator1.hasNext()) {
			 Map.Entry<Student, String> mEntry = iterator1.next();
			 Student key = mEntry.getKey();
	 			String value = mEntry.getValue();
			 sop("key = "+key.toString()+", value = "+ value);
		 }
	}

打印结果:

key = Student [name=lisi, age=33], value = xian
key = Student [name=wangwu, age=25], value = shenzhen
key = Student [name=xiaoming, age=23], value = shanghai
key = Student [name=zhangsan, age=18], value = beijing

TreeMap练习2
"shnsjljsjkdjndhskdn"获取该字符串中字母出现的次数。
希望打印结果:a(1)c(2)…

思路:
1,将字符串转换成字符数组,因为要对每一个字母进行操作
2,定义一个Map集合,因为打印结果的字母有顺序,所以使用treemap集合
3,遍历字符数组。将每一个字母作为键去查Map集合,如果返回为null,将将该字母和1存入到Map集合中,如果返回不是null,说明该字母在Map集合已经存在并有对应次数,那么就获取该次数并进行自增,然后将该字母和自增后的次数存入到Map集合中,覆盖原来键对应的值
4,将Map集合中的数据变成指定的字符串形式返回。
在这里插入图片描述

public class Demo {
	public static void sop(Object object){
		System.out.println(object);
	}
	public static void main(String[] args) {
		
		String str = "sh+nsjlj1sjkdjn-dhskdn";
		int count = 0;
		char [] cs = str.toCharArray();
			
		TreeMap<Character,Integer>  treeMap = new TreeMap<Character,Integer>();
		
		for (int i = 0; i < cs.length; i++) {
			
			//如果非字母,继续循环
			if(!(cs[i] >= 'a' && cs[i] <= 'z' || cs[i] >= 'A' && cs[i] <= 'Z'))
			continue;
				
			Integer value = treeMap.get(cs[i]);
			if(value != null)
				count = value;
			count++;
			treeMap.put(cs[i], count);
			
			count =0;
			
			/*或者这样判断,也可以的
			 * if (value == null) {
				treeMap.put(cs[i], 1);
			}else {
				treeMap.put(cs[i], value+1);
			}*/
		}
		
		StringBuffer buffer = new StringBuffer();
		Set<Map.Entry<Character,Integer>> set = treeMap.entrySet();
		Iterator<Map.Entry<Character,Integer>> iterator = set.iterator();
		while (iterator.hasNext()) {
			Map.Entry<Character,Integer> entry = iterator.next();
			buffer.append(entry.getKey() + "("+entry.getValue()+")");
			sop(buffer.toString());
		}
	}

打印结果:

d(3)h(2)j(4)k(2)l(1)n(3)s(4)

Map扩展

map集合被使用是因为具备映射关系,一对多映射
一个学校有多个教室,一个教室里有多个学生

class Student{
	private String id;
	private String name;
	public Student(String id, String name) {
		this.id = id;
		this.name = name;
	}
	public String getId() {
		return id;
	}
	public String getName() {
		return name;
	}
}
public class Demo {
	public static void sop(Object object){
		System.out.println(object);
	}
	public static void main(String[] args) {
		
		HashMap<String, List<Student>> school = new HashMap<String, List<Student>>();
		
		List<Student> aClass = new ArrayList<Student>();
		List<Student> bClass = new ArrayList<Student>();
	
		school.put("A class", aClass);
		school.put("B class", bClass);
		
		aClass.add(new Student("01", "zhangdan"));
		aClass.add(new Student("02", "wangwu"));
		
		aClass.add(new Student("01", "lisi"));
		aClass.add(new Student("02", "xiaoming"));
	
		//遍历学校,获取班级
		Set<String> set = school.keySet();
		Iterator<String> iterator = set.iterator();
		while (iterator.hasNext()) {
			String classStr =  iterator.next();
			getStudentInfor(school.get(classStr));
		}
	}
	
	public static void getStudentInfor(List<Student> list){
		Iterator<Student> iterator = list.iterator();
		while (iterator.hasNext()) {
			Student student = (Student) iterator.next();
			sop(student.getId() + " ,name = "+student.getName());
		}
	}

打印结果:

01 ,name = zhangdan
02 ,name = wangwu
01 ,name = lisi
02 ,name = xiaoming

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

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

相关文章

【鸿蒙学习】HarmonyOS应用开发者高级认证 - 应用DFX能力介绍(含闯关习题)

学完时间&#xff1a;2024年8月24日 学完排名&#xff1a;第1698名 一、Performance Analysis Kit简介 Performance Analysis Kit&#xff08;性能分析服务&#xff09;为开发者提供应用事件、日志、跟踪分析工具&#xff0c;可观测应用运行时状态&#xff0c;用于行为分析、…

游戏分享网站|基于SprinBoot+vue的游戏分享网站系统(源码+数据库+文档)

游戏分享网站 目录 基于SprinBootvue的游戏分享网站 一、前言 二、系统设计 三、系统功能设计 5.1系统功能模块 5.2后台登录 5.2.1管理员功能模块 5.2.2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#x…

kaggle竞赛宝典 | 量化竞赛第一名的网络模型

本文来源公众号“kaggle竞赛宝典”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;量化竞赛第一名的网络模型 1 简介 今天我们重温Jane Street 大赛第一名的网络模型。该次赛事数据集包含了一组匿名的特征&#xff0c;feature_{0…

2014年4月-2023年上市公司秩鼎ESG评级数据

2014年4月-2023年上市公司秩鼎ESG评级数据 1、时间&#xff1a;2014年4月-2023年11月 2、来源:秩鼎数据 3、指标&#xff1a;证券代码、SC、评级日期、ESG评级、ESG等级、ESG得分、E评级、E等级、E得分、S评级、S等级、S得分、G评级、G等级、G得分、总市值(亿元)、流通市值(…

企业微信聊天记录可以保存多久?员工聊天记录查看指南!合规存档,助力企业规避风险!

在数字化办公的浪潮中&#xff0c;企业微信已成为企业沟通协作的重要工具。然而&#xff0c;聊天记录的保存时长与合规性管理&#xff0c;成为企业不可忽视的问题。 企业微信聊天记录云端最长可保存90天&#xff0c;但企业可根据需求自定义设置。本文将为您详细解析企业微信聊…

Linux TCP多线程服务器

一、多线程开发 线程和进程 程序写好存储在硬盘介质里&#xff0c;CPU读取程序到内存 &#xff0c;这个在内存中的可执行程序实例就叫进程。一个程序如果多次读取到内存中&#xff0c;那他们就是各自独立的进程 内存中的任何位置都有相应的地址方便访问&#xff0c;而在内存中…

8.23-docker基础命令学习

docker 1.docker容器 [rootdocker ~]# systemctl start docker[rootdocker ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcentos latest 5d0da3dc9764 2 years ago 231MB​# 容器执行完就退出了​[rootdocker ~]# docker run -it …

C++20中的简写函数模板(abbreviated function template)

简写函数模板(abbreviated function template):当占位符类型(auto或concept auto)出现在函数声明或函数模板声明的参数列表中时&#xff0c;该声明将声明一个函数模板&#xff0c;并且每个占位符的一个虚构模板参数(one invented template parameter)将附加到模板参数列表。如下…

【412】【K 次乘运算后的最终数组 I】

第一次打周赛&#xff0c;难绷 后两题都差200个样例。 这题很简单&#xff0c;看题就可以 class Solution:def getFinalState(self, nums: List[int], k: int, multiplier: int) -> List[int]:nlen(nums)for i in range(k):mnmin(nums)for j in range(n):if nums[j]mn:nums…

自定义类加载器使用geotools读取高程报 ImageRead: No OperationDescriptor is registered 问题

背景 项目中使用了 自定义classLoader ,&#xff0c;然后使用下面简化后的代码读取高程数据 public class Test{public static void main(String[] args) throwS Exception{CustomClassLoader cl new CustomClassLoader();Class<?> clazz cl.loadClass(“Test”);Te…

后端代码练习5--验证码案例

我们日常生活中&#xff0c;在进行应用程序注册或者登录的时候&#xff0c;出于安全性的考虑&#xff0c;我们都会被进行一项验证的操作&#xff0c;即通过网页给我们的图片进行一些列的操作&#xff0c;最终完成对我们身份的验证并给我们这些用户返回验证码&#xff0c;让我们…

C语言-有两个磁盘文件A和B,各存放一行字母,今要求把这两个文件的信息合并(按字母顺序排列),输出到一个新文件C中去-深度代码解析

1、题目要求 有两个磁盘文件A和B&#xff0c;各存放一行字母&#xff0c;今要求把这两个文件的信息合并&#xff08;按字母顺序排列&#xff09;&#xff0c;输出到一个新文件C中去 2、准备工作 问题1&#xff1a;为什么不需要手动创建C.txt文件&#xff1f; 答&#xff1a;根…

技术分享-商城篇-订单模块-取消/收货功能(十六)

前言 再上一篇文章技术分享-商城篇-用户订单管理&#xff08;十五) 中&#xff0c;订单模块用户操作含有&#xff1a;取消订单、去支付、确认收货、删除订单、查看详情、去退款、查看物流、再次购买等业务操作&#xff0c;以上的每一个操作&#xff0c;都是对应不同的业务和状…

AudioNotes -将音频内容转 markdown

文章目录 一、关于 AudioNotes效果展示音视频识别和整理与音视频内容对话 二、使用方法1、安装 Ollama2、拉取模型3、部署服务3.1 Docker部署&#xff08;推荐&#xff09;&#x1f433;3.2 本地部署 &#x1f4e6; 一、关于 AudioNotes AudioNotes 能够快速提取音视频的内容&…

贪心处理任务(华为od机考题)

一、题目 1.原题 在某个项目中有多个任务&#xff08;用 tasks 数组表示&#xff09;需要您进行处理&#xff0c; 其中 tasks[i] [si, ei]&#xff0c; 你可以在 si < day < ei 中的任意一天处理该任务。 请返回你可以处理的最大任务数。 注&#xff1a;一天可以完成一…

硬件面试经典 100 题(81~90)题

81、请问下图电路中二极管 D1、D2 有什么作用&#xff1f; 在 Vi 输入电压接近于零时&#xff0c;D1、D2 给三极管 T1、T2 提供偏置电压&#xff0c;使 T1、T2 维持导通&#xff0c;以消除交越失真。 陈氏解释 这道题参见&#xff1a;硬件面试经典 100 题&#xff08;51~70 题…

【学习笔记】STM32F407探索者HAL库开发(三)IO分配

【学习笔记】STM32F407探索者HAL库开发&#xff08;三&#xff09;IO分配 1 STM32F407 IO资源分配表2 STM32F407ZGT6 引脚定义3 IO分配的重要性3.1 硬件设计优化3.2 软件编程3.3 系统性能提升 4 F1/F7/H7芯片的IO分配差异4.1 引脚数量和分组4.2 功能模式4.2.1 输入模式4.2.2 输…

Kubernetes 外部 etcd 集群的快速 Docker Compose 部署指南

一、背景 在高可用 Kubernetes 部署中&#xff0c;需要单独部署外部 etcd 集群&#xff0c;而不是使用 kubeadm 默认在 master 节点上部署的 etcd。以下是关于这一配置场景的详细记录。 二、etcd简介 etcd 是一个高可用的分布式键值存储系统&#xff0c;主要用于存储和管理配…

使用Qt+Visual Stuidio写一个简单的音乐播放器(1)

1.使用QMediaPlayer播放音乐 第三步:在代码头部加上: #include <QtMultimedia/QMediaPlayer> // VS向.pro文件添加代码的方式 #pragma execution_character_set("utf-8") // qt支持显示中文 QMediaPlayer类是一个高级媒体播放类。它可以用来播放歌曲、电…

leetcode 893. Groups of Special-Equivalent Strings

原题链接 You are given an array of strings of the same length words. In one move, you can swap any two even indexed characters or any two odd indexed characters of a string words[i]. Two strings words[i] and words[j] are special-equivalent if after any …