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

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);//10TreeSet<String> newSet1 = new TreeSet<>();Collections.addAll(newSet1, "aaa","bbb","ccc","ccc");//利用Collections工具类给集合做批量添加set.addAll(newSet1);//将newSet1中所有的元素添加到set集合的末尾//清空集合中所有的元素//set.clear();System.out.println("判断集合中是否包含指定元素:" + set.contains("王益升"));//trueSystem.out.println("判断集合中是否包含子集合中所有的元素:" + set.containsAll(newSet1));//trueSystem.out.println("判断集合中是否没有元素:" + set.isEmpty());//falseset.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("--------------------------------");//遍历数据 -- foreachfor (String element : set) {System.out.println(element);}System.out.println("--------------------------------");//遍历数据 -- IteratorIterator<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方法省略//判断两个学生是否相同//比较规则:班级号+学号@Overridepublic 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;}@Overridepublic String toString() {return name + "\t" + sex + "\t" + age + "\t" + classId + "\t" + id;}//排序规则:按照年龄排序@Overridepublic 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>() {@Overridepublic 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获取到对应的ValueInteger 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("麻生希"));//trueSystem.out.println("判断集合中是否有指定的value:" + map.containsValue(27));//trueSystem.out.println("判断集合中是否没有元素:" + map.isEmpty());//false//通过key删除映射关系(key+value)map.remove("aaa");//通过key+value删除映射关系(key+value)map.remove("bbb", 20);//通过key替换valuemap.replace("麻生希", 30);//通过key+value替换valuemap.replace("椎名空", 23, 25);//获取映射关系的个数(映射关系内包含了key和value)int size = map.size();System.out.println("获取映射关系的个数:" + size);//10//获取map中所有的valueCollection<Integer> values = map.values();System.out.println(Arrays.toString(values.toArray()));//将集合转换为数组,再将数组转换为字符串System.out.println("-----------------------");//遍历 -- keySet()//思路:获取map集合中所有的key放在一个Set集合中,遍历Set集合获取出key,再通过key获取到Map集合中对应的valueSet<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第一次添加数据,返回为nuullInteger put1 = map.put("麻生希", 27);Integer put2 = map.put("椎名空", 23);Integer put3 = map.put("水菜丽", 28);System.out.println("put1:" + put1);//nullSystem.out.println("put2:" + put2);//nullSystem.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>>() {@Overridepublic int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {Integer v1 = o1.getValue();Integer v2 = o2.getValue();return Integer.compare(v1, v2);}});//遍历ArrayListfor (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.mzph.cn/news/731073.shtml

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

相关文章

机器学习-可解释性机器学习:随机森林与fastshap的可视化模型解析

一、引言 机器学习在当今社会扮演着日益重要的角色&#xff0c;但黑盒模型的不可解释性限制了其应用范围。因此&#xff0c;可解释性机器学习成为研究热点&#xff0c;有助于提高模型的可信度和可接受性。本文旨在探讨随机森林和fastshap作为可视化模型解析工具的应用&#xff…

【生态适配】亚信安慧AntDB数据库与OpenCloudOS、TencentOS Server五款产品完成兼容互认

日前&#xff0c;亚信安慧AntDB数据库与OpenCloudOS8、OpenCloudOS9、TencentOS Server 2、TencentOS Server 3、TencentOS Server 4五款操作系统完成兼容互认。经过严格测试&#xff0c;亚信安慧AntDB数据库与这五款操作系统兼容良好&#xff0c;整体运行稳定。 图1&#xff1…

在Anaconda3的conda中创建虚拟环境下载opencv

opencv下载全流程 一、下载Anaconda 记得从官方网格站进行下载&#xff0c;会有一些慢 下载后进行配置 b站讲解视频&#xff08;非本人&#xff08;平台大神讲解&#xff09;&#xff09; 二、打开conda控制台 这里的两个都可以进行下载 通常我们受用anaconda prompt 三、…

Git基于master创建新分支

在工作中&#xff0c;当有一个新需求的时候&#xff0c;需要基于master进行开发&#xff0c;就需要新建分支&#xff0c;并建立本地和远程分支的关联。 1、先切换到master 分支 git checkout master 2、然后将远程master 分支最新代码拉取到本地master分支 git pull 3、然…

【DevOps基础篇】Docker进阶高级技巧使用

【DevOps基础篇】Docker进阶高级技巧使用 目录 【DevOps基础篇】Docker进阶高级技巧使用清理垃圾删除悬空卷删除已退出的容器删除悬空镜像自动删除交互式容器检查Docker资源美观的JSON和jq处理显示整个Docker信息仅显示插件列出连接到‘bridge’网络的所有容器的IP地址监视容器…

数字人ai直播软件突破AI大模型技术,改变未来科技格局!

数字人AI直播软件在AI大模型技术上的突破&#xff0c;将不可避免地改变未来科技格局。这一突破让人们看到了AI技术的无限可能性&#xff0c;并为未来的科技发展打开了新的大门。 AI大模型技术是近年来人工智能领域的一个热点&#xff0c;它通过构建庞大、复杂的神经网络模型&a…

【AI视野·今日NLP 自然语言处理论文速览 第八十四期】Thu, 7 Mar 2024

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 7 Mar 2024 Totally 52 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers The Heuristic Core: Understanding Subnetwork Generalization in Pretrained Language Models Authors Adith…

Linux如何分割大文件

使用split命令 split -b 200M test.txt ## -b参数指定文件大小&#xff0c;可以是K、M、G、T等 参考&#xff1a;linux系统中split命令

java设计模式之——单例模式

一&#xff1a;什么是单例模式&#xff1f; 构造函数private之后&#xff0c;还需要提供一个方法&#xff0c;要保证只能初始化一个单例对象&#xff0c;并且需要考虑线程安全的问题。 二&#xff1a;单例模式多种写法&#xff1f; 具体到写法上&#xff0c;主要有5种&#…

PostgreSQL容器安装

docker中的centos7中安装 选择对应的版本然后在容器中的centos7中执行下面命令 但是启动容器的时候需要注意 开启端口映射开启特权模式启动init进程 docker run -itd --name centos-postgresql -p 5433:5432 --privilegedtrue centos:centos7 /usr/sbin/init 启动然后进入后先…

UML统一建模语言在软件开发中作用

目录 一、UML助力软件开发的三大核心要素 二、UML在软件开发中的实际应用优势 三、总结与展望 UML&#xff0c;即统一建模语言&#xff0c;在软件开发过程中扮演着举足轻重的角色。它以其直观性、规范性和通用性&#xff0c;为软件项目的成功实施提供了有力的保障。本文将深…

vb.net的treeview点击节点折叠其它分支

vb的treeview控件如何实现点击任意节点&#xff0c;只保留从根目录到当前选择的节点都打开&#xff0c;其他节点关闭&#xff1f; 我的思路是先折叠所有节点&#xff0c;然后循环找点击节点的父节点&#xff0c;一个个展开它们。 Private Sub TreeView1_AfterSelect(sender A…

JAVA实战开源项目:生活废品回收系统(Vue+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 资源类型&资源品类模块3.3 回收机构模块3.4 资源求购/出售/交易单模块3.5 客服咨询模块 四、免责说明 一、摘要 1.1 项目介绍 生活废品回收系统是可持续发展的解决方案&#xff0c;旨在鼓…

CQBW(服务器部分)

计算检材 4-A.rar 的 MD5(128bit)校验值。&#xff08;答案格式: 字母大写&#xff09; 请写出镜像中系统&#xff08;用户名: root 密码: btLUN5Tb)的操作系统版本名称;&#xff08;答案格式: redhat; 小写、不带空格、特殊字符及版本号&#xff09; 也可以仿真来看 sed -i s…

HarmonyOS 数据持久化 关系型数据库之 初始化操作

上文 HarmonyOS 数据持久化之首选项 preferences 我们有说用户首选项 但它只能处理一些比较简单的数据类型结构 的持久化处理 如果是一些批量较大 结构较为复杂的数据结构 那么 首选项就无法满足了 我们就要选择 关系型数据库 通过 SQLite 组件实现的一种本地数据库&#xff0…

10 事务控制

文章目录 事务控制事务概述事务操作事务四大特性事务隔离级别 事务控制 事务概述 MySQL 事务主要用于处理操作量大&#xff0c;复杂度高的数据。比如说&#xff0c;在人员管理系统中&#xff0c;你删除一个人员&#xff0c;既需要删除人员的基本资料&#xff0c;也要删除和该…

校园生活信息平台:Java+Vue+MySQL全栈实践

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Mint_21.3 drawing-area和goocanvas的FB笔记(五)

FreeBASIC SDL图形功能 SDL - Simple DirectMedia Layer 是完整的跨平台系统&#xff0c;有自己的窗口、直接捕获键盘、鼠标和游戏操纵杆的事件&#xff0c;直接操作音频和CDROM&#xff0c;在其surface上可使用gfx, openGL和direct3D绘图。Window3.0时代&#xff0c;各种应用…

Webpack常用配置及作用

一 、 二、 三、 四、 五、 六、 七、 八、

防御保护--IPSEC VPPN实验

实验拓扑图 实验背景&#xff1a;FW1和FW2是双机热备的状态。 实验要求&#xff1a;在FW5和FW3之间建立一条IPSEC通道&#xff0c;保证10.0.2.0/24网段可以正常访问到192.168.1.0/24 IPSEC VPPN实验配置&#xff08;由于是双机热备状态&#xff0c;所以FW1和FW2只需要配置FW1…