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

文章目录

  • 集合
    • 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.hqwc.cn/news/577686.html

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

相关文章

flink: 将接收到的tcp文本流写入HBase

一、依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.o…

AcWing刷题-空调

空调 差分&#xff1a; N int(input()) p list(map(int, input().split())) t list(map(int, input().split())) d,s[0]*100010,[0]*100010 for i in range(N):d[i] p[i]-t[i]for i in range(N):s[i] d[i]s[i1] - d[i] ans 0 for i in range(N1):if s[i]>0:ans s[i]…

常见的Nginx+Redis+MQ+DB架构设计

三高&#xff0c;复杂的架构 SQRS CAP 缓存&#xff0c;限流 【Redis&#xff0c;缓存】 cache-aside 缓存cache&#xff1a;数据源的副本 store 1. Read/Write Through Pattern 读写穿透模式 redis&#xff1a;放当前在线用户&#xff0c;热点数据

三个对象组练习.java

题目&#xff1a;定义数组存储3部汽车对象&#xff1b;汽车属性&#xff1a;品牌&#xff0c;价格&#xff0c;颜色&#xff1b;创造3个汽车对象&#xff0c;数据通过键盘录入而来&#xff0c;并把数据存储到数组当中 分析&#xff1a; 在main&#xff08;&#xff09;里面定义…

java分割回文串(力扣Leetcode131)

分割回文串 力扣原题链接 问题描述 给定一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是回文串。返回 s 所有可能的分割方案。 示例 示例 1: 输入&#xff1a;s “aab” 输出&#xff1a;[[“a”,“a”,“b”],[“aa”,“b”]] 示例 2: 输…

简易挛生分拣系统设计

1 工效组合展示 2 方案规划设计 3 数字挛生建模 基础建模、动画设计、模型导出 4 软件体系架构 5 Web交互设计 5.1 页面架构 5.2 初始构造 5.3 模型运用 5.4 WS通信 5.5 运行展现 6 服务支撑编码 6.1 整体调度 6.2 WS服务 6.3 C/S通信 7 系统级调试完善

Chrome 插件各模块使用 Fetch 进行接口请求

Chrome 插件各模块使用 Fetch 进行接口请求 常规网页可以使用 fetch() 或 XMLHttpRequest API 从远程服务器发送和接收数据&#xff0c;但受到同源政策的限制。 内容脚本会代表已注入内容脚本的网页源发起请求&#xff0c;因此内容脚本也受同源政策的约束&#xff0c;插件的来…

鸿蒙开发第一节

一.开发准备-工具安装 1.鸿蒙开发官网&#xff1a;华为开发者联盟-智能终端能力开放,共建开发者生态 (huawei.com) 2.DevEco Studio3.1下载链接HUAWEI DevEco Studio和SDK下载和升级 | 华为开发者联盟 点击下载按钮进行下载2.1解压文件2.2双击运行此程序 2.3安装软件 点击N…

day22.二叉树part08

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

记录C++中,vector的迭代器在push_back以后扩容导致迭代器失效的问题

前言 vector是我们用到最多的数据结构&#xff0c;其底层数据结构是单端动态数组&#xff0c;由于数组的特点&#xff0c;vector也具有以下特性&#xff1a; ①O(1)时间的快速访问&#xff1b; ②顺序存储&#xff0c;所以插入到非尾结点位置所需时间复杂度为O(n)&#xff0c;删…

ARMv8-A架构下的外部debug模型(external debug)简介

Armv8-A external debug Armv8-A debug模型一&#xff0c;外部调试 External debug 简介二&#xff0c;Debug state2.1 Debug state的进入与退出 三&#xff0c;DAP&#xff0c;Debug Access Port3.1 EDSCR, External Debug Status and Control Register调试状态标识&#xff0…

小型分布式文件存储系统GoFastDfs应用简介

前言 最近稍微留意了一下各个文件存储系统的协议&#xff0c;发现minio是LGPLV3, 而fastdfs 是GPL3,这些协议其实对于商业应用是一个大坑。故而寻找一些代替品。 go-fastdfs就是其中之一&#xff0c;官网在&#xff1a; go-fastdfs 具体应用 其实可以直接查看官网教程的。 下…