当前位置: 首页 > news >正文

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 特点&#xff1a;有序 唯一 实现类&#xff1a;TreeSet 利用TreeSet特有的对数据进行升序&#xff0c;再放到ArryList进行for下标倒序打印&#xff0c;或者利用自身的pollLast&#xff08;&#xff09;取出最后元…...

JavaScript 第27章:构建工具与自动化

在现代JavaScript开发中&#xff0c;构建工具、代码转换工具、代码质量和代码格式化工具对于提高开发效率、保持代码整洁以及确保代码质量有着至关重要的作用。下面将分别介绍Webpack、Babel、ESLint和Prettier的配置与使用&#xff0c;并给出一些示例。 1. 构建工具&#xff…...

Android原生ROM出现WIFI显示网络连接受限,网络无法连接的问题

Android原生ROM出现WIFI显示网络连接受限,网络无法连接的问题 最近手里一台乐视的手机root后, 连接wifi时一直提示网络连接受限,wifi图标显示叹号. 但是不影响正常的网络访问. 解决办法: adb shell settings delete global captive_portal_modeadb shell settings put globa…...

如何实现网页上的闪烁效果

在网页上实现闪烁效果通常可以通过CSS或者JavaScript来完成。有两种方法&#xff1a;一种是使用纯CSS&#xff0c;另一种是结合JavaScript来创建更复杂的闪烁效果。 方法一&#xff1a;使用纯CSS CSS中可以使用animation属性来创建简单的动画效果&#xff0c;包括闪烁效果。这…...

事件总线—Event Bus 使用及讲解

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

信息安全工程师(67)网络流量清洗技术与应用

前言 网络流量清洗技术是现代网络安全领域中的一项关键技术&#xff0c;它主要用于过滤和清理网络流量中的恶意部分&#xff0c;确保正常的网络通信。 一、网络流量清洗技术的定义与原理 网络流量清洗技术&#xff0c;也称为流量清理&#xff08;Traffic Scrubbing&#xff09;…...

【项目】论坛系统测试

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

XJ02、消费金融|消费金融业务模式中的主要主体

根据所持有牌照类型的不同&#xff0c;消费金融服务供给方主要分为商业银行、汽车金融公司、消费金融公司和小贷公司&#xff0c;不同类型机构定位不同、提供消费金融服务与产品类型也各不相同。此外&#xff0c;互联网金融平台也成为中国消费金融业务最重要的参与方之一&#…...

基于神经网络的农业病虫害损失预测

【摘 要】鉴于农业病虫害经济损失的预测具有较强的复杂性和非线性特性&#xff0c;设计了一种新型的GRNN预测模型&#xff0c;对农业病虫害经济损失进行预测。该模型基于人工神经网络捕捉非线性变化独特的优越性&#xff0c;在神经网络技术和江苏省气象局提供的数据的基础上&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框架&#xff0c; 旨在快速开发可维护和可扩展的Web应用程序。 使用Django框架的开发步骤&#xff1a; 1.选择合适的版本 2.安装及配置 3.生成项目结构 4.内容开发 5.迭代、上线、维护 Django官网&#xff1a; Djang…...

qt QMainWindow详解

一、概述 QMainWindow继承自QWidget&#xff0c;并提供了一个预定义的布局&#xff0c;将窗口分成了菜单栏、工具栏、状态栏和中央部件区域。这些区域共同构成了一个功能丰富的主窗口&#xff0c;使得应用程序的开发更加简单和高效。 二、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 解析&#xff1a; 栈和队列是两个不一样的结构&#xff0c;不能放在一起表示 7. B 8. C 解析&#xff1a; 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&#xff0c;可以选择cpp.zip 其他语言选择对应的链接即可 希望支持…...

【算法优化】混合策略改进的蝴蝶优化算法

摘要 蝴蝶优化算法 (Butterfly Optimization Algorithm, BOA) 是一种新兴的智能优化算法&#xff0c;其灵感来自蝴蝶的觅食行为。本文基于经典BOA&#xff0c;通过引入混合策略进行改进&#xff0c;从而提高其在全局寻优和局部搜索中的性能。实验结果表明&#xff0c;改进的蝴…...

什么是标准差?详解

文章目录 一、什么是标准差&#xff1f;二、公式三、举个例子&#x1f330;参考 一、什么是标准差&#xff1f; 在统计学中&#xff0c;标准差&#xff08;Standard Deviation&#xff09;是用于衡量变量值围绕其平均值变化程度的指标。低标准差表示这些值通常接近平均值&…...

C++20中头文件syncstream的使用

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

判断特定时间点开仓的函数(编程技巧)

如何使用最新的MQL4语言创建并应用一个判断当前是否可以开启或增加交易仓位的函数。通过详细讲解函数的代码实现、核心功能及其在实际交易策略中的调用方法。 函数代码 以下是一个用MQL4编写的函数&#xff0c;用于检测在特定时间点是否可以开仓或增仓。 extern int MagicNumb…...

如何新建一个React Native的项目

要新建一个 React Native 项目&#xff0c;你可以使用 React Native 官方推荐的工具 React Native CLI 或者 Expo。两者的区别在于&#xff1a;React Native CLI 提供更多对原生代码的访问权限&#xff0c;适合构建复杂的应用&#xff1b;而 Expo 是一个开发工具链&#xff0c;…...

学习--图像信噪比

目录 图像信噪比 图像信噪比 图像信噪比的计算公式&#xff1a; 其中&#xff0c; 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)处的像素值。 信噪…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...