学习JavaEE日子 Day24 TreeSet,内置比较器,外置比较器,HashMap

news2024/12/24 8:22:03

Day24 TreeSet

1.TreeSet

1.1 TreeSet的使用

注意:TreeSet的使用和HashSet一样

public class Test01 {
	public static void main(String[] args) {
		
		//创建TreeSet集合的对象
		TreeSet<String> set = new TreeSet<>();
		
		//添加元素
		set.add("麻生希");
		set.add("椎名空");
		set.add("水菜丽");
		set.add("朝桐光");
		set.add("三上悠亚");
		set.add("水野朝阳");
		set.add("古川伊织");
		set.add("xxx");
		set.add("yyy");
		set.add("zzz");
		
		//获取元素个数
		int size = set.size();
		System.out.println("获取元素个数:" + size);//10
		
		TreeSet<String> newSet1 = new TreeSet<>();
		Collections.addAll(newSet1, "aaa","bbb","ccc","ccc");//利用Collections工具类给集合做批量添加
		set.addAll(newSet1);//将newSet1中所有的元素添加到set集合的末尾
		
		//清空集合中所有的元素
		//set.clear();
		
		System.out.println("判断集合中是否包含指定元素:" + set.contains("王益升"));//true
		System.out.println("判断集合中是否包含子集合中所有的元素:" + set.containsAll(newSet1));//true
		
		System.out.println("判断集合中是否没有元素:" + set.isEmpty());//false
		
		set.remove("朝桐光");//根据元素删除元素
		set.removeAll(newSet1);//删除set中包含newset1的元素(去除交集)
		
		TreeSet<String> newSet2 = new TreeSet<>();
		Collections.addAll(newSet2, "xxx","yyy","zzz","zzz");//利用Collections工具类给集合做批量添加
		set.retainAll(newSet2);//保留set中包含newset2的元素(保留交集)
		
		//将集合转成数组
		Object[] objs = set.toArray();
		System.out.println(Arrays.toString(objs));
		
		//将集合转成数组
		String[] ss = new String[set.size()];
		set.toArray(ss);
		System.out.println(Arrays.toString(ss));
		
		System.out.println("--------------------------------");
		
		//遍历数据 -- foreach
		for (String element : set) {
			System.out.println(element);
		}
		
		System.out.println("--------------------------------");
		
		//遍历数据 -- Iterator
		Iterator<String> it = set.iterator();
		while(it.hasNext()){//判断是否有可迭代的元素
			
			String element = it.next();//返回下一个元素
			System.out.println(element);
		}
		
	}
}

1.2 TreeSet的特点 – 自然排序

理解:TreeSet会根据元素类型的不同自动选择排序规则

TreeSet存储Integer的排序规则:数字升序

TreeSet存储String的排序规则:字典排序

public class Test02 {
	public static void main(String[] args) {
		
		//TreeSet存储Integer的排序规则:数字升序
		TreeSet<Integer> set1 = new TreeSet<>();
		set1.add(30);
		set1.add(10);
		set1.add(50);
		set1.add(40);
		set1.add(20);
		for (Integer element : set1) {
			System.out.println(element);
		}
		
		System.out.println("---------------------------");
		
		
		//TreeSet存储String的排序规则:字典排序
		TreeSet<String> set2 = new TreeSet<>();
		set2.add("b");
		set2.add("d");
		set2.add("a");
		set2.add("c");
		set2.add("ad");
		set2.add("ab");
		set2.add("ac");
		for (String element : set2) {
			System.out.println(element);
		}		
		
	}
}

1.3 研究内置比较器的使用 – Comparable

需求:创建学生类,将学生类的对象添加到TreeSet中

public class Test03 {
	public static void main(String[] args) {
		
		TreeSet<Student> set = new TreeSet<>();
		
		set.add(new Student("麻生希", '女', 27, "2401", "001"));        
		set.add(new Student("椎名空", '女', 23, "2401", "002"));        
		set.add(new Student("水菜丽", '女', 21, "2401", "003"));        
		set.add(new Student("朝桐光", '女', 31, "2401", "004"));        
		set.add(new Student("北岛玲", '女', 36, "2401", "005"));        
		set.add(new Student("樱井步", '女', 29, "2401", "006"));        
		set.add(new Student("爱田奈奈", '女', 32, "2401", "007"));       
		set.add(new Student("水野朝阳", '女', 31, "2401", "008"));       
		set.add(new Student("古川伊织", '女', 27, "2401", "009"));       
		set.add(new Student("巴得伟", '男', 21, "2401", "010"));        
		set.add(new Student("李星乐", '男', 20, "2401", "011"));        
		set.add(new Student("北条麻衣", '女', 34, "2402", "001"));       
		set.add(new Student("濑亚美莉", '女', 23, "2402", "002"));       
		set.add(new Student("三上悠亚", '女', 21, "2402", "003"));       
		set.add(new Student("小西满里惠", '女', 31, "2402", "004"));      
		set.add(new Student("桃谷绘里香", '女', 27, "2402", "005"));      
		set.add(new Student("铃原爱蜜莉", '女', 23, "2402", "006"));      
		set.add(new Student("明日花绮罗", '女', 28, "2402", "007"));      
		set.add(new Student("京香Julia", '女', 34, "2402", "008"));    
		set.add(new Student("巴得伟", '男', 18, "2402", "009"));        
		set.add(new Student("张海杰", '男', 20, "2402", "010"));        

		for (Student stu : set) {
			System.out.println(stu);
		}
		
	}
}
public class Student implements Comparable<Student>{//要实现Comparable<Student>

	private String name;
	private char sex;
	private int age;
	private String classId;
	private String id;
	
	//无参构造,有参构造,get/set方法省略
	
	//判断两个学生是否相同
	//比较规则:班级号+学号
	@Override
	public boolean equals(Object obj) {
		if(this == obj){
			return true;
		}
		
		if(obj instanceof Student){
			Student stu = (Student) obj;
			if(this.classId.equals(stu.classId) && this.id.equals(stu.id)){
				return true;
			}
		}
		return false;
	}

	@Override
	public String toString() {
		return name + "\t" + sex + "\t" + age + "\t" + classId + "\t" + id;
	}

	//排序规则:按照年龄排序
	@Override
	public int compareTo(Student o) {
		//this表示添加到TreeSet中的学生对象
		//o表示TreeSet中的学生对象
		return this.age - o.age;
	}
}

1.4 研究外置比较器的使用 – Comparator

需求:将学生类的对象添加到TreeSet中

场景 - 联合开发:

1.Student类是小伟开发的

2.小李要把Student类的对象添加到TreeSet中,但是Student的排序规则不满足小李的需求

3.小李想的是按照名字长度排序,长度一致按照年龄排序

比较器的优先级别:外置比较器 > 内置比较器

public class Test04 {
	public static void main(String[] args) {
		
		//扩展:new Comparator 匿名内部类的使用场景!!!
		
		TreeSet<Student> set = new TreeSet<>(new Comparator<Student>() {
			@Override
			public int compare(Student o1, Student o2) {
				if(o1.equals(o2)){
					return 0;
				}
				
				int nameLen1 = o1.getName().length();
				int nameLen2 = o2.getName().length();
				if(nameLen1 != nameLen2){
					//return nameLen1 - nameLen2;
					return Integer.compare(nameLen1, nameLen2);
				}
				
				int age1 = o1.getAge();
				int age2 = o2.getAge();
				if(age1 != age2){
					return Integer.compare(age1, age2);
				}
				return 1;
			}
		});
		
		set.add(new Student("麻生希", '女', 27, "2401", "001"));        
		set.add(new Student("椎名空", '女', 23, "2401", "002"));        
		set.add(new Student("水菜丽", '女', 21, "2401", "003"));        
		set.add(new Student("朝桐光", '女', 31, "2401", "004"));        
		set.add(new Student("北岛玲", '女', 36, "2401", "005"));        
		set.add(new Student("樱井步", '女', 29, "2401", "006"));        
		set.add(new Student("爱田奈奈", '女', 32, "2401", "007"));       
		set.add(new Student("水野朝阳", '女', 31, "2401", "008"));       
		set.add(new Student("古川伊织", '女', 27, "2401", "009"));       
		set.add(new Student("巴得伟", '男', 21, "2401", "010"));        
		set.add(new Student("李星乐", '男', 20, "2401", "011"));        
		set.add(new Student("北条麻衣", '女', 34, "2402", "001"));       
		set.add(new Student("濑亚美莉", '女', 23, "2402", "002"));       
		set.add(new Student("三上悠亚", '女', 21, "2402", "003"));       
		set.add(new Student("小西满里惠", '女', 31, "2402", "004"));      
		set.add(new Student("桃谷绘里香", '女', 27, "2402", "005"));      
		set.add(new Student("铃原爱蜜莉", '女', 23, "2402", "006"));      
		set.add(new Student("明日花绮罗", '女', 28, "2402", "007"));      
		set.add(new Student("京香Julia", '女', 34, "2402", "008"));    
		set.add(new Student("巴得伟", '男', 18, "2402", "009"));        
		set.add(new Student("张海杰", '男', 20, "2402", "010"));        

		for (Student stu : set) {
			System.out.println(stu);
		}
		
	}
}

小结:比较器接口

作用:排序时使用

分类:

​ 内置比较器:Comparable - compareTo()

​ 外置比较器:Comparator - compare()

使用场景:

​ 内置比较器:对象要想存入TreeSet、TreeMap中,对象所属的类必须要实现内置比较器

​ 外置比较器:当内置比较的规则不满足现在的需求,但又不能改动内置比较器规则时

优先级别:外置比较器 > 内置比较器

2.HashMap

在这里插入图片描述

2.1 HashMap的使用

public class Test01 {
	public static void main(String[] args) {
		
		HashMap<String, Integer> map = new HashMap<>();
		
		//添加元素
		map.put("麻生希", 27);
		map.put("椎名空", 23);
		map.put("水菜丽", 28);
		map.put("朝桐光", 36);
		map.put("爱田奈奈", 32);
		map.put("水野朝阳", 28);
		map.put("波多野结衣", 28);
		
		//将newMap中所有的元素添加到map集合中
		HashMap<String, Integer> newMap = new HashMap<>();
		newMap.put("aaa", 10);
		newMap.put("bbb", 20);
		newMap.put("ccc", 30);
		newMap.put("ddd", 40);
		map.putAll(newMap);
		
		//如果key存在就获取value值,如果不存在就添加
		Integer putIfAbsent = map.putIfAbsent("麻生希111", 28);
		System.out.println("putIfAbsent:" + putIfAbsent);
		
		//通过Key获取到对应的Value
		Integer integer1 = map.get("水菜丽");
		System.out.println("通过Key获取对应的value:" + integer1);//28
		
		//通过Key获取对应的value,如果key不存在则返回默认值
		Integer integer2 = map.getOrDefault("麻生希111", 888);
		System.out.println("通过Key获取对应的value:" + integer2);//888
		
		//清空集合中的元素
		//map.clear();
		
		System.out.println("判断集合中是否有指定的key:" + map.containsKey("麻生希"));//true
		System.out.println("判断集合中是否有指定的value:" + map.containsValue(27));//true
		
		System.out.println("判断集合中是否没有元素:" + map.isEmpty());//false
		
		//通过key删除映射关系(key+value)
		map.remove("aaa");
		
		//通过key+value删除映射关系(key+value)
		map.remove("bbb", 20);
		
		//通过key替换value
		map.replace("麻生希", 30);
		
		//通过key+value替换value
		map.replace("椎名空", 23, 25);
		
		//获取映射关系的个数(映射关系内包含了key和value)
		int size = map.size();
		System.out.println("获取映射关系的个数:" + size);//10
		
		//获取map中所有的value
		Collection<Integer> values = map.values();
		System.out.println(Arrays.toString(values.toArray()));//将集合转换为数组,再将数组转换为字符串
		
		System.out.println("-----------------------");
		
		//遍历 -- keySet()
		//思路:获取map集合中所有的key放在一个Set集合中,遍历Set集合获取出key,再通过key获取到Map集合中对应的value
		Set<String> keySet = map.keySet();
		for (String key : keySet) {
			Integer value = map.get(key);
			System.out.println(key + " -- " + value);
		}
		
		System.out.println("-----------------------");
		
		//遍历 -- entrySet()
		//思路:获取map集合中所有的映射关系对象放在一个Set集合中,遍历Set集合获取出映射关系对象(Key+Value)
		Set<Entry<String,Integer>> entrySet = map.entrySet();
		for (Entry<String, Integer> entry : entrySet) {
			String key = entry.getKey();
			Integer value = entry.getValue();
			System.out.println(key + " -- " + value);
		}
	}
}

2.2 HashMap的注意事项

注意:put方法即使添加也是替换

public class Test02 {
	public static void main(String[] args) {
		
		HashMap<String, Integer> map = new HashMap<>();		
		
		//put第一次添加数据,返回为nuull
		Integer put1 = map.put("麻生希", 27);
		Integer put2 = map.put("椎名空", 23);
		Integer put3 = map.put("水菜丽", 28);
		System.out.println("put1:" + put1);//null
		System.out.println("put2:" + put2);//null
		System.out.println("put3:" + put3);//null
		
		//使用put添加数据,如果map中有key,就替换value值,返回被替换的值
		Integer put4 = map.put("水菜丽", 29);
		System.out.println("put4:" + put4);//28
	
		//遍历 -- entrySet()
		//思路:获取map集合中所有的映射关系对象放在一个Set集合中,遍历Set集合获取出映射关系对象(Key+Value)
		Set<Entry<String,Integer>> entrySet = map.entrySet();
		for (Entry<String, Integer> entry : entrySet) {
			String key = entry.getKey();
			Integer value = entry.getValue();
			System.out.println(key + " -- " + value);
		}	
	
	}
}

2.3 针对于HashMap的value排序

1.将map的映射关系对象取出,返回Set集合

2.将Set集合转换为ArrayList集合

3.利用ArrayList的sort方法去排序

public class Test03 {
	public static void main(String[] args) {
		
		HashMap<String, Integer> map = new HashMap<>();		
		
		map.put("麻生希", 27);
		map.put("椎名空", 23);
		map.put("水菜丽", 28);
		map.put("朝桐光", 36);
		map.put("爱田奈奈", 32);
		map.put("水野朝阳", 28);
		map.put("波多野结衣", 28);
		
		//将map的映射关系对象取出,返回Set集合
		Set<Entry<String,Integer>> entrySet = map.entrySet();
		
		//将Set集合转换为ArrayList集合
		ArrayList<Entry<String,Integer>> list = new ArrayList<>(entrySet);
		
		//利用ArrayList的sort方法去排序
		list.sort(new Comparator<Entry<String,Integer>>() {

			@Override
			public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
				Integer v1 = o1.getValue();
				Integer v2 = o2.getValue();
				return Integer.compare(v1, v2);
			}
		});
		
		//遍历ArrayList
		for (Entry<String, Integer> entry : list) {
			System.out.println(entry);
		}	
	
	}
}

2.4 HashMap的特点

注意:

1.HashMap的key不允许重复,Key是唯一的

2.HashMap的value允许重复

HashMap的特点:无序 + key去重

public class Test04 {
	public static void main(String[] args) {
		
		HashMap<String, Integer> map = new HashMap<>();		
		
		map.put("麻生希", 27);
		map.put("椎名空", 23);
		map.put("北岛玲", 23);
		map.put("水菜丽", 28);
		map.put("水菜丽", 29);
		map.put("水菜丽", 30);
		
		Set<Entry<String,Integer>> entrySet = map.entrySet();
		for (Entry<String, Integer> entry : entrySet) {
			System.out.println(entry);
		}
			
	}
}

总结

1.TreeSet
使用
特点(TreeSet的排序规则是怎样实现的 – 思想)
内置比较器
外置比较器

2.HashMap
使用
注意事项
面试题

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

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

相关文章

Excel生成 chart 混合图表

在开发中有这样一个需求&#xff0c;邮件预警的时候&#xff0c;要求邮件主体内容是一个Chart 图表&#xff08;生成后的img&#xff09;&#xff0c;邮件需要有附件&#xff0c;且附件是Excel列表加图表&#xff0c;图表类型是混合图。 回顾&#xff1a;在之前一篇讲到如何使用…

Java中 常见的开源图库介绍

阅读本文之前请参阅------Java中 图的基础知识介绍 在 Java 中&#xff0c;有几种流行的开源图库&#xff0c;它们提供了丰富的图算法和高级操作&#xff0c;可以帮助开发者更高效地处理图相关的问题。以下是几种常见的 Java 图库及其特点和区别&#xff1a; JGraphT …

【C++】---string的OJ题

【C】---string的OJ题 1.字符串转整形数字&#xff08;重要&#xff09;&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;思路展示&#xff08;3&#xff09;代码实现 2.字符串相加&#xff08;重要&#xff09;&#xff08;1&#xff09;题目描述&#xff08;2&am…

vim使用命令

1、 复制粘贴 复制一行: yy p vim 1.txt 进入编辑模式&#xff0c;在需要复制的行先按两下y键&#xff0c;再按p就完成复制复制2行&#xff1a; 2yy p 复制n行&#xff1a; nyy p 2、 删除 删除一行: dd删除2行: 2dd删除n行: ndd 3、 撤销 撤销上一步操作&#xff1a;…

【三、接口协议与抓包】使用ApiPost进行接口测试

你好&#xff0c;我是山茶&#xff0c;一个探索AI 测试的程序员。 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相…

前端javascript Promise使用方法详解(非常全面)

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属的专栏&#xff1a;前端零基础教学&#xff0c;实战进阶 景天的主页&#xff1a;景天科技苑 文章目录 Promise对象&#xff08;1&#xff09;…

鸿蒙开发:从入门到精通的全方位学习指南

随着华为鸿蒙HarmonyOS生态系统的迅速扩展&#xff0c;越来越多的开发者渴望深入了解并掌握这一前沿技术。本文旨在为鸿蒙开发新手提供一份详尽且实用的学习教程&#xff0c;助您从零开始&#xff0c;逐步迈向鸿蒙开发的巅峰。 一、鸿蒙开发环境搭建 DevEco Studio安装&#x…

12---风扇电路设计

视频链接 风扇硬件电路设计01_哔哩哔哩_bilibili 风扇电路设计 1、风扇简介 电脑风扇又称为散热风扇&#xff0c;一般用于散热。提供给散热器和机箱使用。市面上一般的散热风扇尺寸大小由直径2.5cm到30cm都有&#xff0c;厚度由6mm到76mm都有&#xff0c;而根据不同运作要求…

美摄科技对抗网络数字人解决方案

在数字化浪潮的推动下&#xff0c;企业对于高效、创新且具备高度真实感的数字化解决方案的需求日益迫切。美摄科技凭借其在人工智能和计算机视觉领域的深厚积累&#xff0c;推出了一款全新的对抗网络数字人解决方案&#xff0c;该方案能够为企业构建出表情和动作都极为逼真的数…

ssm+vue的高校课程评价系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的高校课程评价系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

SSL---VPN

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.SSL-VPN概述 SLL VPN是一种基于HTTPS&#xff08;即支持SSL的HTTP协议&#xff09;的远程安全接入技术。它充分利用了SSL协议提供的基于证书的身份认证、数据加密和消息完整性验证机制&#…

2024.3.10 C++

提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数要求使用C风格字符串完成 #include <iostream>using namespace std;int main() {char str[20];cout << "please enter the str:";gets(str);int u…

sqli-labs练习

2关 找出数据库名字 从数据库security 中找到表明名: 找到数据库名字: 从表users中找到列: 取出表users用户名和密码:用户名~密码 3关 判断出id是(‘id’)的形式 4关 双引号测试报错,推测是(“id“) 5关 填写id=1没有回显信息(布尔盲注一般适用于页面没有回显字…

connection SQLException, url:jdbc ,errorCode 0, state 08S01

connection SQLException, url: jdbc:mysql://localhost:3306/itcast_health?useUnicodetrue&characterEncodingutf-8, errorCode 0, state 08S01 添加&#xff1a;&useSSLfalse 添加前 添加后&#xff1a; 查询数据库正常

2.1 关系数据结构及形式化定义 数据库概论

目录 2.1.1 关系 关系&#xff1a;概念 1. 域&#xff08;Domain&#xff09; 2.笛卡尔积 元组&#xff08;Tuple&#xff09; 分量&#xff08;Component&#xff09; 基数&#xff08;Cardinal number&#xff09; 3. 关系 候选码&#xff08;Candidate key&#xf…

Docker 快速入门实操教程ER(完结)

Docker 快速入门实操教程&#xff08;完结&#xff09; 如果安装好Docker不知道怎么使用&#xff0c;不理解各个名词的概念&#xff0c;不太了解各个功能的用途&#xff0c;这篇文章应该会对你有帮助。 前置条件&#xff1a;已经安装Docker并且Docker成功启动。 实操内容&…

Leetcode 675 为高尔夫比赛砍树

文章目录 1. 题目描述2. 我的尝试3. 题解1. BFS 1. 题目描述 Leetcode 675 为高尔夫比赛砍树 2. 我的尝试 typedef priority_queue<int, vector<int>, greater<int>> heap;class Solution { public:int m;int n;int bfs(vector<vector<int>>&…

【力扣hot100】刷题笔记Day25

前言 这几天搞工作处理数据真是类似我也&#xff0c;还被老板打电话push压力有点大的&#xff0c;还好搞的差不多了&#xff0c;明天再汇报&#xff0c;赶紧偷闲再刷几道题&#xff08;可恶&#xff0c;被打破连更记录了&#xff09;这几天刷的是动态规划&#xff0c;由于很成…

二分查找刷题(二)

目录 1.搜索插入位置 算法原理 代码编写 2.x 的平方根 算法原理 代码编写 3.山脉数组的峰顶索引 算法原理 1.搜索插入位置 算法原理 判断二段性 可以将区间分于5和大于等于5的两个区间&#xff0c;可以使用二分查找搜索左区间的模板。 代码编写 int searchInsert(vect…

【触想智能】工业触摸显示器在户外使用需要注意哪些问题?

工业显示器是智能制造领域应用比较广泛的电子产品&#xff0c;它广泛应用于工厂产线以及各种配套设备&#xff0c;在很大程度上提升了工厂的生产效率。 工业显示器按触摸方式分&#xff0c;可以分为工业触摸显示器和非触摸工业显示器两种;按使用环境分&#xff0c;又可以分为室…