集合,排序查找算法,可变参数

文章目录

  • 集合
    • Set集合
      • TreeSet集合
    • Map集合
      • 概述
      • 特点
      • 子类及其底层数据结构
      • 常用方法
      • 遍历
  • 数据结构
      • 常见的数据结构
        • 二叉树
  • 可变参数
    • 介绍
    • 格式
    • 注意
  • Collections工具类
    • 方法
  • 排序查找算法
    • 冒泡排序
      • 介绍
      • 原理
      • 注意
      • 代码
    • 选择排序
      • 介绍
      • 原理
      • 规律
      • 代码
    • 二分查找
      • 前提
      • 介绍
      • 原理
      • 注意
      • 代码

集合

Set集合

TreeSet集合

底层结构:红黑树结构
存储的元素会按照规则进行排序

  • 在TreeSet集合中存储:String,Integer,Double,Character //JDK提供的类型
    • 都默认实现了java.lang.Comparable接口(自带自然排序规则)
  • 在TerrSet集合中存储:自定义类型 //程序员自己定义的
    • 就必须保证自定义类型,要实现Comparable接口,并重写compareTo方法
    • 如果自定义类型没有实现Comparable接口,在遍历set集合时会发生异常
  • compareTo方法
//比较大小  0 相同  负数表示小   整数表示大
public int compareTo(E e){//自然排序规程//返回结果有三种:0,负数,正数(底层红黑树需要)
}

排序规则

  1. 自然排序:元素需要实现Comparable接口
  2. 比较器排序:元素不需要实现Comparable接口,需要在创建TreeSet对象时,指定排序规则

构造方法

public TreeSet() //默认使用自然排序
public TreeSet(Comparator c) //指定比较器对象

比较器:Comparator接口(泛型接口)
int compare(Object o1,Object o2) //比较俩个元素的大小: 0,正数,负数
o1:要存储的元素
o2:已存在的元素

Map集合

概述

是一个存储成对数据的集合,称之为双列集合。Collection称之为单列集合
存储的数据,称之为键值对(Entry),底层key=value存在

特点

  1. 可以存储2个元素(键值对元素)
  2. key元素不能重复,value元素可以重复
  3. 一个key元素只能对应一个value元素(一一对应),能通过key找到value
  4. 存储元素不保证顺序
  5. 没有索引

子类及其底层数据结构

java.util.Map(接口)

  • HashMap:底层使用哈希表
  • LinkedHashMap:底层使用哈希表+链表
  • TreeMap:底层使用红黑树

HashSet底层实现就是HashMap的键值完成的,同理其他俩个也是

常用方法

Snipaste_2024-03-29_21-11-03.png
添加和修改都是put;修改需要在键的位置写上进行修改的键值即可

遍历

不能直接遍历,只能间接性实现遍历操作

  1. 键找值方式
    1. 获取Map集合中所有的key元素,遍历所有的key,通过key元素找到对应的value元素

Map对象.keySet();

  1. 键值对对象
    1. 获取Map集合中所有的Map.Entry对象,遍历所有的Entry对象,通过Entry中的API获取key,value

Map对象.entrySet();
键要唯一,所有键的存储对象为自定义对象时,要重写hashCode和equals方法
TreeMap参考TreeSet

数据结构

常见的数据结构

二叉树

Snipaste_2024-03-29_16-35-06.png

二叉查找树
Snipaste_2024-03-29_16-39-04.png

规则:小的存左边,大的存右边,一样的不存
平衡二叉树
Snipaste_2024-03-29_16-41-59.png
Snipaste_2024-03-29_16-42-28.png
红黑树(平衡二叉B树)
Snipaste_2024-03-29_16-47-03.png

可变参数

介绍

在调用方法是传入任意个参数,底层是使用数组

格式

public 返回值类型 方法名(参数类型... 参数名){//...就是可变参数的语法表示格式
}

注意

  • 可变参数只能作为方法的最后一个参数,前面可以有也可以没有参数
  • 可变参数本质上是数组,不能作为方法的重载。(一个方法参数为可变参数,有一个相同方法参数为参数名相同的数组)

Collections工具类

  • 不能创建对象
  • 提供了静态方法
  • 针对List,Set集合进行相关操作(排序,二分查找,添加元素…)

方法

static <T> boolean addAll(Collection<T> c, T... elements)  
//添加任意多个数据到集合中

排序查找算法

冒泡排序

介绍

将一组数据按照升序规则进行排序

原理

相邻的数据俩俩比较,大的放后面

注意

  1. 如果有n个数据进行排序,总共需要比较n-1轮
  2. 每一次比较完毕,下一次的比较就会少一个数据参与

代码

int[] arr = {5,3,2,6,1};//数组中有n个元素,进行n-1轮排序for (int i = 0; i < arr.length - 1; i++) {//第一轮:3,2,5,1,6//第二轮:2,3,1,5,6//第三轮:2,1,3,5,6//第四轮:1,2,3,5,6for (int j = 0; j < arr.length - 1 - i; j++) {if (arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}System.out.println(Arrays.toString(arr));

选择排序

介绍

将一组数据进行升序或降序排序

原理

每一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。

规律

  1. 有n个元素,就要比较n-1轮
  2. 每一轮中都会选出一个最值元素,较前一趟少比较一次

代码

//升序
int[] arr = {5,8,3,6,1};for (int i = 0; i < arr.length - 1; i++) {for (int j = i + 1; j < arr.length; j++) {if (arr[i] > arr[j]){int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}}}System.out.println(Arrays.toString(arr));
//降序的话只需改成arr[i] < arr[j]即可

二分查找

前提

数组中的元素需要有序

介绍

也叫折半查找,是在一组有序(升序/降序)的数据中查找一个元素,它是一种效率较高的查找方法

原理

将目标元素与查找氛围的中间值作比较,将目标元素分到较大/较小的一组,重复上诉步骤,知道目标元素=中间值

注意

  1. 查找的过程中,min<=max作为循环的条件,当min>max时,循环结束,查找元素不存在
  2. 利用mid=(min+max)/2索引来确定中间值
    1. 如果目标数>中间值,说明在右边,min=mid+1
    2. 如果目标数<中间值,说明在左边,max=mid-1

代码

 public static void main(String[] args) {int[] arr = {2,4,6,8,9,11,15,36,59};int msg = binarySearch(arr,1);if (msg < 0){System.out.println("目标数不存在");}else {System.out.println("目标数存在,索引为" + msg);}}public static int binarySearch(int[] arr,int key){int min = 0;int max = arr.length - 1;while (min <= max){int mid = (min + max) / 2;if (key == arr[mid]){return mid;}else if (key > arr[mid]){min = mid + 1;}else {max = mid -1;}}return -1;}

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

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

相关文章

大话设计模式之代理模式

代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许通过代理对象控制对另一个对象的访问。代理对象充当客户端和实际对象之间的中介&#xff0c;客户端通过代理对象间接访问实际对象&#xff0c;从而可以在访问控制、缓存、延迟加载等方面提…

蓝桥杯刷题第四天

思路&#xff1a; 这道题很容易即可发现就是简单的暴力即可完成题目&#xff0c;我们只需满足所有数的和为偶数即可保证有满足条件的分法&#xff0c;同时也不需要存下每个输入的数据&#xff0c;只需要知道他是偶数还是奇数即可&#xff0c;因为我们只需要偶数个奇数搭配在一块…

如何使用命令行对RK开发板进行OpenHarmony版本烧录?

问题 在 OpenHarmony 自动化测试环境中&#xff0c;需要对流水线上的 RK 设备进行烧录&#xff0c;图形工具只能人工操作&#xff0c;那么有什么方法可以纯命令行进行自动化烧录呢&#xff1f; 思路 我们发现 RK 开发板实际是使用 upgrade_tool 的执行文件进行烧录的&#x…

公众号文章怎么写?手把手教你

公众号文章写作是讲究技巧和经验的&#xff0c;按照爆款文章的逻辑和结构走&#xff0c;你也能写出精彩的公众号推文&#xff0c;本文伯乐网络传媒将为你揭秘公众号文章的写作之道&#xff0c;纯干货&#xff0c;建议收藏起来慢慢看。 一、文章结构安排 1. 标题策划&#xff1…

使用Leaflet.rotatedMaker进行航班飞行航向模拟的实践

目录 前言 一、Leaflet的不足 1、方向插件 2、方向控制脚本说明 二、实时航向可视化实现 1、创建主体框架 2、飞机展示 3、位置和方位模拟 三、成果及分析 1、成果展示 2、方向绑定解读 总结 前言 众所周知&#xff0c;物体在空间中的运动&#xff08;比如飞行、跑步…

Windows11 使用 VirtualBox 安装创建 Ubuntu虚拟机

〇、背景 开发者大比例习惯都是Windows下编辑代码&#xff0c;比如使用Windows的Visual Studio Code进行代码的开发。但不管是AOSP还是鸿蒙开发&#xff0c;目前都不支持windows本地环境编译的&#xff0c;建议使用Ubuntu操作系统环境对源码进行编译。 因此&#xff0c;没有U…

redis集群配置(精华版):主从复制模式

主从复制模式 概念&#xff1a;作用&#xff1a;为什么使用集群&#xff1a;动手实操1、环境准备2、配置redis.conf配置文件3、再次查看主从节点信息4、验证主从模式 概念&#xff1a; ​ 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器…

Manjaro 安装全新 Linux 版微信,从此告别 Wine

目前已经基本上使用 Manjaro 来工作&#xff0c;而工作离不开微信作为日常的工作沟通工具。因为微信官方一直没有 Linux 版本的&#xff0c;所以之前都只能够使用 Wine 版本&#xff0c;然后踩了不少坑&#xff0c;但还算能勉强使用。 最近听说微信终于要发布 Linux 版本的&am…

网络层/数据链路层/其他协议/ARP/NAT

网络层 IP协议 前置认识 我们之前详谈过TCP协议&#xff0c;TCP协议主要是提供一种可靠的传输策略&#xff0c;但是并不能直接将报文发送给对方主机&#xff0c;而IP协议的本质就是提供一种将数据跨网络从A主机送到B主机的能力&#xff0c;而用户需要的是一种将数据 可靠的 跨…

【数据结构】新篇章 -- 顺序表

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;python从入门到精通&#xff0c;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文…

银行监管报送系统介绍(八):银行业大额交易和可疑交易报告数据报送

依据《金融机构大额交易和可疑交易报告管理办法》&#xff1a; 第五条 金融机构应当报告下列大额交易&#xff1a; &#xff08;一&#xff09;当日单笔或者累计交易人民币5万元以上&#xff08;含5万元&#xff09;、外币等值1万美元以上&#xff08;含1万美元&#xff09;的…

AI大模型引领金融创新变革与实践【文末送书-46】

文章目录 AI大模型的定义与特点AI大模型在金融领域的应用 01 大模型在金融领域的 5 个典型应用场景02 大模型在金融领域应用所面临的风险及其防范03 AIGC 技术的科林格里奇困境04 金融机构使用 AIGC 技术的 4 条可能路径AIGC重塑金融&#xff1a;AI大模型驱动的金融变革与实践…

农学院智慧农业产教融合基地解决方案

第一章 背 景 1.1国际数字农业发展概况 随着全球信息化、智能化技术的快速发展&#xff0c;数字农业作为现代农业发展的重要方向&#xff0c;正日益受到国际社会的广泛关注。数字农业依托物联网、大数据、云计算、人工智能等现代信息技术&#xff0c;实现农业生产全过程的智能…

上采样技术在语义分割中的应用

目录 概要 一、概述 二、实现方法 1.转置卷积 2.反池化 3.双线性插值法 三、在经典网络中的的应用 1.U-Net 2.FCN 总结 概要 上采样是用于深度学习中提高语义分割精度的技术&#xff0c;可以实现图像放大和像素级别标注 一、概述 神经网络的基本结构为&#xff1a;…

我是如何在学术界占有一席之地的——专注于我的写作

罗伯特纽贝克 “作为一个移民&#xff0c;你是怎么发表这么多文章的&#xff1f;”意识到我不是以英语为母语的人&#xff0c;当我去年面试教职时&#xff0c;人们无数次问过这个问题。我知道披露我的挣扎不太可能让我找到工作&#xff0c;所以我会笑着说&#xff1a;“我喜欢…

【c 语言 】malloc函数详解

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

LeetCode 热题 100 题解(一):哈希部分

《LeetCode热题 100》 经过了两个多月&#xff0c;终于刷完了代码随想录的题目&#xff0c;现在准备开始挑战热题一百了&#xff0c;接下来我会将自己的题解以博客的形式同步发到力扣和 c 站&#xff0c;希望在接下来的征程中与大家共勉&#xff01; 题组一&#xff1a;哈希 题…

day22.二叉树part08

day22.二叉树part08 235.二叉搜索树的最近公共祖先 原题链接 代码随想录链接 思路&#xff1a;因为本题是二叉搜索树&#xff0c;利用它的特性可以从上往下进行递归遍历树&#xff0c;这里需要理解一点就是如果遍历到的一个节点发现该节点的值正好位于节点p和节点q的值中间…

Git实现提交代码自动更新package.json版本号

此文章主要讲诉如何通过git提交代码来自动更新我们的版本号&#xff0c;也可以指定固定分支才能更新 只要涉及到package version的项目都可以&#xff0c;例如&#xff1a;Vue、React、Node等等 前提是当前项目已经关联了Git仓库 一、编写我们的Node更新版本逻辑&#xff0c;名…

QSplashScreen

以前打红警的时候进入游戏界面会有一个启动界面&#xff0c;比如美国是有伞兵&#xff0c;英国有狙击手&#xff0c;韩国有黑鹰战机的一些介绍&#xff0c;这些就是启动界面&#xff0c;就是由QSplashScreen这个类来实现的。 QSplashScreen 是 Qt 框架中的一个类&#xff0c;用…