java 17天 TreeSet以及Collections
SortedSet
TreeSet
Collections
所有单值集合
1 SortedSet
特点:有序 唯一
实现类:TreeSet
利用TreeSet特有的对数据进行升序,再放到ArryList进行for+下标倒序打印,或者利用自身的pollLast()取出最后元素并删除打印
import java.util.*;
public class Exec1{public static void main(String[] args){TreeSet<Integer> set = new TreeSet<>();Collections.addAll(set,45,23,78,100,66);// 数值大小升序// [23, 45, 66, 78, 100]System.out.println(set);// 降序打印所有的元素// 倒序【想用下标=>ArrayList】// [23, 45, 66, 78, 100]// => list [list不会改变原来集合中元素的顺序]ArrayList<Integer> list = new ArrayList<>(set);for(int index = list.size()-1; index >= 0; index--){System.out.println(list.get(index));}// [23, 45, 66, 78, 100]// 取出并删除最后一个// 100 => [23, 45, 66, 78]// 只要集合中有元素 => 条件 【while】while(!set.isEmpty()){System.out.println(set.pollLast());}}
}
2.TreeSet
特点:有序 唯一
数据结构:二叉树【红黑树】【自平衡二叉搜索树】
左子树:<根节点
右子树:>根节点
遍历:中序遍历
2.1 TreeSet1 - 基础用法
特有的方法:
first() 返回第一个元素【最小-泛型升序】
pollFirst() 返回+删除第一个元素
last() 返回最后一个元素【最大的-泛型升序】
pollLast() 返回+删除最后一个元素
* Integer的自然顺序-数值大小升序
* String的自然顺序-内容每一个字符 升序
2.2TreeSet2-定义规则
如果一个元素想要加入TreeSet中 需要泛型具有比较规则
如何具有比较规则-》implements Comparable<泛型>
泛型-跟谁比较
实现接口注定需要覆盖接口中的抽象方法
@Override
public int compareTo(泛型 old){升序return 新的xx - 旧的xx 【基本数据类型】return 新的xx.compareTo(旧的xx)【引用数据类型】降序return 旧的xx - 新的xx; 【基本数据类型】
/return 旧的xx.compareTo(新的xx);【引用数据类型】
}class String implements Comparable<String>....
2.3 TreeSet3-多个属性参与排序
如果多个属性参与排序
优先按照xxx排序 再按照yyy排序
if(xxx不一样的时候)
return xxx-。。。;
if(yyy不一样的时候)
return yyy-。。。;
* 所有属性都一样 舍弃 return 0;
* 所有属性都一样 也不能放弃任何一个元素 return 1;// 【非0】
2.4 TreeSet4-return 1【没有return 0】
TreeSet中各个方法出现的现象:【原因:只看compareTo】
add(元素) 打破TreeSet的唯一性【同一个地址都可以添加多次】
remove(元素) 永远删不掉
contains(元素) 永远返回 false
2.5 TreeSet5 - 遍历+删除
1 TreeSet中数据 => ArrayList
利用ArrayList有下标
for+下标 / 倒序删除
2 迭代器的遍历+迭代器的删除
2.6 TreeSet6 - 修改内容
如果要修改的属性参与比较规则的生成[compareTo/compare]
不能直接修改 采用 1删2改3添加
如果属性没有参与比较规则 直接修改
简单练习
import java.util.*;
public class Exec4{public static void main(String[] args){TreeSet<Food> set = new TreeSet<>();Food f1 = new Food("猪耳朵拌黄瓜",23,2);Food f2 = new Food("小鸡炖蘑菇",45,1);Food f3 = new Food("82年的茅台",18000,0);Food f4 = new Food("西红柿鸡蛋汤",25,3);Food f5 = new Food("炒饼",7,4);Food f6 = new Food("辣椒炒肉",23,1);Collections.addAll(set,f1,f2,f3,f4,f5,f6);//System.out.println(set);//打印集合对象的时候显示://[XXX菜:XXX类型,YYY菜:YYY类型...]System.out.println(set);// 最近西红柿太贵了 删掉所有西红柿相关的菜// 遍历+判断+删除 =》 CME// 迭代器的遍历+迭代器的删除for(Iterator<Food> car = set.iterator();car.hasNext();){Food ff = car.next();if(ff.name.contains("西红柿"))car.remove();}System.out.println(set.size());// 今天我开心 所有酒水打八折// 遍历+修改【1删2改3添加】LinkedList<Food> temp = new LinkedList<>();for(Iterator<Food> car = set.iterator();car.hasNext();){Food ff = car.next();if(ff.type == 0){//1 删除car.remove();//2 修改ff.price *= 0.8;//3 添加temp.add(ff);}}set.addAll(temp);System.out.println(set);}
}class Food implements Comparable<Food>{static String[] data = {"酒水","热菜","凉菜","汤","主食"};String name;int price;int type;//[0:酒水 1:热菜 2:凉菜 3:汤 4:主食]public Food(String name,int price,int type){this.name = name;this.price = price;this.type = type;}@Overridepublic int compareTo(Food old){//所有的菜优先按照价格降序排序//如果价格一样的话 那么按照类型升序排序//如果价格 类型都一样的话 那么按照名字升序排序//如果都一样 那么也不能舍弃if(this.price != old.price)return old.price - this.price;if(this.type != old.type)return this.type - old.type;if(!this.name.equals(old.name))return this.name.compareTo(old.name);return 1;}@Overridepublic String toString(){// [0:酒水 1:热菜 2:凉菜 3:汤 4:主食]return name+":"+data[type]+" "+price;}}
2.7 TreeSet的构造方法
1 要求泛型自身具有比较能力
// class 泛型 implements Comparable<泛型>{}
TreeSet<泛型> set = new TreeSet<>();
2 TreeSet特点:有序-比较顺序 唯一
// 要求泛型自身具有比较能力
TreeSet<泛型> set = new TreeSet<>(Collection);
3 TreeSet set = new TreeSet(Comparator)
应用场景:1 原有自然顺序不可改 2 类型没有顺序但是不可改类型
// 按照比较器的规则【按照定制排序】
BJQ bb = new BJQ();
TreeSet<Integer> set = new TreeSet<>(bb);
Collections.addAll(set,34,23,45);
System.out.println(set);// 降序
//========================================
// BJQ是一个比较器
class BJQ implements Comparator<Integer>{
// 谁 vs 谁
@Override
public int compare(Integer x, Integer y){
// 新的 旧的
// 内部的逻辑与compareTo相同
return y-x;
}
}
根据构造方法 然后提供比较器进行排序
import java.util.*;
public class Exec6{public static void main(String[] args){TreeSet<String> set = new TreeSet<>(new BJQ());Collections.addAll(set,"12月22","3月8","12月20","5月17");//升序排序System.out.println(set);}
}class BJQ implements Comparator<String>{@Overridepublic int compare(String x, String old){// x 和 old格式 xx月xx// data[0]-月 data[1]-日String[] data = x.split("月");// temp[0]-月 temp[1]-日String[] temp = old.split("月");// 优先按照月份进行升序// 月份相同 按照日进行升序if(!data[0].equals(temp[0])){return Integer.parseInt(data[0])- Integer.parseInt(temp[0]);}return Integer.parseInt(data[1])- Integer.parseInt(temp[1]);}
}
BJQ设计成单例模式 通过类名调用 不能造对象
import java.util.*;
public class Exec7{public static void main(String[] args){TreeSet<Teacher> set = new TreeSet<>(BJQ.getOnly());Teacher t1 = new Teacher("汪老师",30,10000);Teacher t2 = new Teacher("张三",30,10000.1);Collections.addAll(set,t1,t2);for(Teacher t : set){System.out.println(t);}}
}
//脱离开老师类制定他的排序规则
//优先按照工资降序排序
//工资一样的话 按照年龄升序排序
//年龄一样的话 按照姓名长度升序排序
//所有属性都一样 舍弃 -》 单例模式
class BJQ implements Comparator<Teacher>{// 1 私有化构造方法 【外界不可以new BJQ()】private BJQ(){}// 2 创建一个私有的 静态的 属于本类类型的对象private static BJQ only = new BJQ();// 3 提供一个公共的 静态的 返回本类类型的方法public static BJQ getOnly(){return only;}@Overridepublic int compare(Teacher x, Teacher old){if(x.getSalary() != old.getSalary())// 强转【忽略小数点】// double => Doublereturn Double.valueOf(old.getSalary()).compareTo(Double.valueOf(x.getSalary()));if(x.getAge() != old.getAge())return x.getAge() - old.getAge();//return x.getName().length()-old.getName().length();if(!x.getName().equals(old.getName()))return x.getName().length()-old.getName().length();return 0;}
}//封装 不能动
class Teacher{String name;int age;double salary;public Teacher(String name,int age,double salary){this.name = name;this.age = age;this.salary = salary;}public String getName(){return name;}public void setName(String name){this.name = name;}public int getAge(){return age;}public void setAge(int age){this.age = age;}public double getSalary(){return salary;}public void setSalary(double salary){this.salary = salary;}@Overridepublic String toString(){return name + "[" + age + "]" + salary;}
}
Collections针对List进行的方法
Collections针对List集合提供方法
Collections.sort(List):按照集合的泛型的自然顺序排序
Collections.sort(List,Comparator):按照比较器的定制顺序排序
Collections.reverse(List):反转List中的数据
List ll = Collections.synchronizedList(List对象);将线程不安全的List转为线程安全的List集合
例子
public static void main(String[] args){ArrayList<Integer> list = new ArrayList<>();Collections.addAll(list,56,23,100);System.out.println(list);// 56 23 100Collections.sort(list);// Integer的自然顺序System.out.println(list);// 23 56 100Collections.sort(list, new BJQ());System.out.println(list);// 100 56 23Collections.reverse(list);System.out.println(list);// 23 56 100}
}
class BJQ implements Comparator<Integer>{@Overridepublic int compare(Integer x, Integer y){return y - x;}
}
collections针对所有单值集合提供的方法
Collections针对所有单值集合提供的方法T Collections.max(Collection);按照泛型的自然顺序返回集合中的"最大"值【前提:升序】【取最后一个】T Collections.max(Collection,Comparator);按照比较器的定制顺序返回"最大"值【前提:升序】【取最后一个】T Collections.min(Collection);按照泛型的自然顺序返回集合中的"最小"值【前提:升序】【取第一个】T Collections.min(Collection,Comparator);按照比较器的定制顺序返回"最小"值【前提:升序】【取第一个】Collections.addAll(Collection, T ... x); 往集合中一次添加多个元素int Collections.frequency(Collection,元素);某个元素在集合中出现的次数
举例
public static void main(String[] args){HashSet<Integer> set = new HashSet<>();Collections.addAll(set,34,56,100,66);int num = Collections.frequency(set,34);System.out.println(num);// Integer 的自然顺序来的【升序】// 最大值=最后一个//Integer max = Collections.max(set);//System.out.println(max);// 100// Integer max = Collections.max(set, new BJQ());// System.out.println(max);// 34//Integer min = Collections.min(set);//System.out.println(min);// 34Integer min = Collections.min(set, new BJQ());System.out.println(min);// 100}
}
class BJQ implements Comparator<Integer>{@Overridepublic int compare(Integer x, Integer y){return y - x;}
}
相关文章:
java 17天 TreeSet以及Collections
SortedSet TreeSet Collections 所有单值集合 1 SortedSet 特点:有序 唯一 实现类:TreeSet 利用TreeSet特有的对数据进行升序,再放到ArryList进行for下标倒序打印,或者利用自身的pollLast()取出最后元…...
JavaScript 第27章:构建工具与自动化
在现代JavaScript开发中,构建工具、代码转换工具、代码质量和代码格式化工具对于提高开发效率、保持代码整洁以及确保代码质量有着至关重要的作用。下面将分别介绍Webpack、Babel、ESLint和Prettier的配置与使用,并给出一些示例。 1. 构建工具ÿ…...
Android原生ROM出现WIFI显示网络连接受限,网络无法连接的问题
Android原生ROM出现WIFI显示网络连接受限,网络无法连接的问题 最近手里一台乐视的手机root后, 连接wifi时一直提示网络连接受限,wifi图标显示叹号. 但是不影响正常的网络访问. 解决办法: adb shell settings delete global captive_portal_modeadb shell settings put globa…...
如何实现网页上的闪烁效果
在网页上实现闪烁效果通常可以通过CSS或者JavaScript来完成。有两种方法:一种是使用纯CSS,另一种是结合JavaScript来创建更复杂的闪烁效果。 方法一:使用纯CSS CSS中可以使用animation属性来创建简单的动画效果,包括闪烁效果。这…...

事件总线—Event Bus 使用及讲解
一、工作原理 事件总线,主要用来实现非父子组件之间的传值。 它的工作原理:通过new Vue()再创建一个新的 Vue 实例对象bus,将这个新的实例对象作为桥梁,来实现两个组件之间的传值。 二、工作步骤 1、创建事件总线 bus 我们可以…...

信息安全工程师(67)网络流量清洗技术与应用
前言 网络流量清洗技术是现代网络安全领域中的一项关键技术,它主要用于过滤和清理网络流量中的恶意部分,确保正常的网络通信。 一、网络流量清洗技术的定义与原理 网络流量清洗技术,也称为流量清理(Traffic Scrubbing)…...

【项目】论坛系统测试
文章目录 一、项目介绍二、测试环境三、测试用例3.1 论坛系统功能测试用例3.2 论坛系统非功能测试用例 四、测试计划1. 手工测试1.1 注册页面1.2 登陆页面1.3 主页面(列表页) 2. 自动化测试2.1 添加对应的依赖2.2 Utils类(公有类)…...

XJ02、消费金融|消费金融业务模式中的主要主体
根据所持有牌照类型的不同,消费金融服务供给方主要分为商业银行、汽车金融公司、消费金融公司和小贷公司,不同类型机构定位不同、提供消费金融服务与产品类型也各不相同。此外,互联网金融平台也成为中国消费金融业务最重要的参与方之一&#…...
基于神经网络的农业病虫害损失预测
【摘 要】鉴于农业病虫害经济损失的预测具有较强的复杂性和非线性特性,设计了一种新型的GRNN预测模型,对农业病虫害经济损失进行预测。该模型基于人工神经网络捕捉非线性变化独特的优越性,在神经网络技术和江苏省气象局提供的数据的基础上&am…...
【DSP】TI 微控制器和处理器的IDE安装CCSTUDIO
【DSP】TI 微控制器和处理器的IDE安装CCSTUDIO 1.背景2.下载IDE3.安装IDE1.背景 TI:Texas instruments即德州仪器公司。 https://www.ti.com.cn/CCSTUDIO即Code Composer Studio。 Code Composer Studio 是适用于 TI 微控制器和处理器的集成开发环境 (IDE)。 它包含一整套用于…...

Web应用框架-Django应用基础
1. 认识Django Django是一个用Python编写的开源高级Web框架, 旨在快速开发可维护和可扩展的Web应用程序。 使用Django框架的开发步骤: 1.选择合适的版本 2.安装及配置 3.生成项目结构 4.内容开发 5.迭代、上线、维护 Django官网: Djang…...

qt QMainWindow详解
一、概述 QMainWindow继承自QWidget,并提供了一个预定义的布局,将窗口分成了菜单栏、工具栏、状态栏和中央部件区域。这些区域共同构成了一个功能丰富的主窗口,使得应用程序的开发更加简单和高效。 二、QMainWindow的常用组件及功能 菜单栏&…...

第二单元历年真题整理
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 参考答案 1. A 2. A 3. A 4. D 5. D 6. D 解析: 栈和队列是两个不一样的结构,不能放在一起表示 7. B 8. C 解析: S --> A0 | B1 --> (S1 | 1) 0 | (S0 | 0)1 --> S10 | 10 | S…...
Ubuntu下载protobuf
1 安装依赖库 sudo apt-get install autoconf automake libtool curl make g unzip -y2 下载protobuf ProtoBuf 下载地址:https://github.com/protocolbuffers/protobuf/releases 如果要在 C 下使⽤ ProtoBuf,可以选择cpp.zip 其他语言选择对应的链接即可 希望支持…...

【算法优化】混合策略改进的蝴蝶优化算法
摘要 蝴蝶优化算法 (Butterfly Optimization Algorithm, BOA) 是一种新兴的智能优化算法,其灵感来自蝴蝶的觅食行为。本文基于经典BOA,通过引入混合策略进行改进,从而提高其在全局寻优和局部搜索中的性能。实验结果表明,改进的蝴…...
什么是标准差?详解
文章目录 一、什么是标准差?二、公式三、举个例子🌰参考 一、什么是标准差? 在统计学中,标准差(Standard Deviation)是用于衡量变量值围绕其平均值变化程度的指标。低标准差表示这些值通常接近平均值&…...

C++20中头文件syncstream的使用
<syncstream>是C20中新增加的头文件,提供了对同步输出流的支持,即在多个线程中可安全地进行输出操作,此头文件是Input/Output库的一部分。包括: 1.std::basic_syncbuf:是std::basic_streambuf的包装器(wrapper)&…...

判断特定时间点开仓的函数(编程技巧)
如何使用最新的MQL4语言创建并应用一个判断当前是否可以开启或增加交易仓位的函数。通过详细讲解函数的代码实现、核心功能及其在实际交易策略中的调用方法。 函数代码 以下是一个用MQL4编写的函数,用于检测在特定时间点是否可以开仓或增仓。 extern int MagicNumb…...
如何新建一个React Native的项目
要新建一个 React Native 项目,你可以使用 React Native 官方推荐的工具 React Native CLI 或者 Expo。两者的区别在于:React Native CLI 提供更多对原生代码的访问权限,适合构建复杂的应用;而 Expo 是一个开发工具链,…...

学习--图像信噪比
目录 图像信噪比 图像信噪比 图像信噪比的计算公式: 其中, M M M和 N N N分别表示图像长度和宽度上的像素数。 f ( i , j ) f(i,j) f(i,j) 和 g ( i , j ) g(i,j) g(i,j)分别是原始图像和去噪后的图像在点 ( i , j ) (i,j) (i,j)处的像素值。 信噪…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...