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)处的像素值。 信噪…...
零基础玩转CTFShow Web1-7:手把手教你用Burp Suite和蚁剑拿flag
零基础玩转CTFShow Web1-7:从工具配置到实战渗透全指南 第一次接触CTF比赛时,看着其他选手在终端里敲出神秘代码就能拿到flag,总觉得这是黑客才能掌握的"黑魔法"。直到自己动手尝试才发现,只要掌握正确的工具和方法&…...
PyTorch 2.8镜像多场景落地:智慧农业病虫害识别模型田间部署方案
PyTorch 2.8镜像多场景落地:智慧农业病虫害识别模型田间部署方案 1. 田间AI的迫切需求 现代农业正面临病虫害防治的严峻挑战。传统人工巡查方式效率低下,一个熟练的技术员每天最多能检查3-5亩作物,而大型农场往往需要数十人同时作业。更棘手…...
探索AI原生应用领域向量数据库的无限潜力
探索AI原生应用领域向量数据库的无限潜力关键词:向量数据库、AI原生应用、Embedding、向量相似度、多模态检索、大模型协同、语义理解摘要:当AI从“辅助工具”进化为“原生生产力”,一种专为AI设计的数据库——向量数据库,正在重塑…...
OpenClaw+Qwen3-VL:30B:学术论文图表解析助手
OpenClawQwen3-VL:30B:学术论文图表解析助手 1. 为什么需要论文图表解析助手 作为一名经常需要阅读大量文献的科研工作者,我深刻体会到处理论文图表的痛苦。传统的工作流程通常是:下载PDF论文→手动截图→用OCR工具识别→复制数据到Excel→…...
ESP32嵌入式系统设计与实现指南
1. 项目概述1.1 系统架构本项目基于ESP32主控芯片设计,采用模块化架构实现多功能嵌入式系统。系统包含以下核心模块:主控单元:ESP32-WROOM-32D模组电源管理:TPS63020升降压转换器传感器接口:I2C/SPI多协议兼容设计人机…...
FireRedASR-AED-L在Windows系统的部署问题解决方案
FireRedASR-AED-L在Windows系统的部署问题解决方案 1. 引言 如果你正在Windows系统上尝试部署FireRedASR-AED-L这个强大的语音识别模型,可能会遇到各种让人头疼的问题。环境配置、依赖冲突、GPU兼容性——这些都是Windows环境下部署深度学习模型时常见的拦路虎。 …...
LabelMe高级应用:如何利用AI辅助标注提升效率300%
LabelMe高级应用:如何利用AI辅助标注提升效率300% LabelMe是一款强大的图像标注工具,支持多边形、矩形、圆形、线条、点和图像级标记等多种标注方式。对于AI训练数据准备工作而言,高效的标注工具能显著提升工作流效率。本文将详细介绍如何利…...
聚焦数据中心基建核心:我国服务器机架导轨市场规模达8.1亿元,产业支撑力凸显
据恒州诚思最新调研数据显示,2025年全球服务器机架导轨市场规模达8.1亿元,预计至2032年将增长至11.61亿元,期间复合增长率(CAGR)为5.3%。这一增长受多重因素驱动:全球数据中心建设加速,预计2026…...
Joy-Con Toolkit:让Switch玩家掌控设备的开源管理方案
Joy-Con Toolkit:让Switch玩家掌控设备的开源管理方案 【免费下载链接】jc_toolkit Joy-Con Toolkit 项目地址: https://gitcode.com/gh_mirrors/jc/jc_toolkit 为什么Switch玩家需要专属管理工具? 当你插入Switch游戏卡带时,是否担心…...
苹果内购Java后端避坑指南:沙盒测试、凭据验证与订单防重的那些事儿
苹果内购Java后端避坑指南:沙盒测试、凭据验证与订单防重的那些事儿 第一次对接苹果应用内购(IAP)时,我以为按照官方文档走完流程就万事大吉了。直到凌晨三点收到服务器告警——重复充值、验证超时、沙盒环境漏测等问题接踵而至。…...
