首页 > 其他分享 >Arrays工具类二分查找方法binarySearch方法详解​

Arrays工具类二分查找方法binarySearch方法详解​

时间:2023-12-18 17:08:01浏览次数:36  
标签:Arrays binarySearch int 查找 数组 返回值 方法 详解

Arrays工具类二分查找方法binarySearch方法详解

基础知识

该方法的一般形式是public static <T> int binarySearch(T[] a, T key),对于基本类型,都有相应的重载方法,如针对int类型有binarySearch(int[] a, int key)等。

该方法的原理是使用二分查找算法在指定的数组中搜索指定的值。在调用此方法之前,必须对数组进行排序(如通过sort(double[])方法),也即查找前数据必须是有序的。如果没有排序,则结果无意义。如果数组包含多个具有指定值的元素,则无法保证会找到哪一个。因此,调用本方法要保证源数组是有序的,且内部的元素是唯一的。

实际上,binarySearch方法可以对任意对象的数组进行排序,只需在调用本方法时实例化一个比较器Comparator即可,方法如下:

public static <T> int binarySearch(T[] a, T key, Comparator<? super T> c) 

返回值详解

该方法返回值为:

第一种情况:如果要搜索的值包含在数组中,则返回搜索键的索引值(是一个int值);

第二种情况:如果数值中找不到要查找的值(也即key),则返回值为:(-(插入点)- 1)。

插入点被定义为将键插入数组中的点:第一个大于键的元素的索引,或者如果数组中的所有元素都小于指定的键,则为a.length。返回负值的原因是要保证,如果能找到要查找的值时,返回值将大于等于0。

所以返回值有以下4种情况:

  • 如果数组中所有值都大于要查找的值,那么将返回-1
  • 如果要查找的值在数组中存在,则返回其索引
  • 如果要查找的值不在数组中,但其值的大小在数组的范围内,则返回(-(插入点)- 1)
  • 如果要查找的值大于数组中所有值,则返回(-(a.length)-1)

例如:

int[] arr = {10, 20, 30, 40, 50};
System.out.println(Arrays.binarySearch(arr, 50));
System.out.println(Arrays.binarySearch(arr, 15));

运行结果为:

4
-2

原理如图:

Arrays工具类二分查找方法binarySearch方法详解​_数组




标签:Arrays,binarySearch,int,查找,数组,返回值,方法,详解
From: https://blog.51cto.com/tangxiaohu/8875436

相关文章

  • 更新升级 | iTOP-RK3588开发板手册分类详解
    迅为iTOP-RK3588开发板配套手册升级!因为开发资料众多(目前手册资料已达2700+页),为了方便大家更快速上手使用开发板,迅为iTOP-RK3588开发板配套手册按功能性分为了13大类,如下所示  1快速定位 每个分类下包含了对应主题的PDF文档资料,这样大家可以快读定位需要使用的文档。每个主题下......
  • JVM详解
    1.JVM由那些部分组成,运行流程是什么?JVM是什么好处:一次编写,到处运行自动内存管理,垃圾回收机制思考:JVM由哪些部分组成,运行流程是什么?从图中可以看出JVM的主要组成部分ClassLoader(类加载器)RuntimeDataArea(运行时数据区,内存分区)ExecutionEngine(执行引擎)NativeMethodLibrary(本地......
  • 详解appium自动化测试工具(monitor、uiautomatorviewer)
    appium是一个自动化测试开源工具,支持iOS和Android平台上的原生应用,web应用和混合应用。移动原生应用:单纯用ios或者android开发语言编写的、针对具体某类移动设备、可直接被安装到设备里的应用,一般可通过应用商店获取,比如某个游戏app;移动web应用:使用移动浏览器访问的应用(appium支......
  • 详解rust 自动化测试、迭代器与闭包、智能指针、无畏并发
    编写测试可以让我们的代码在后续迭代过程中不出现功能性缺陷问题;理解迭代器、闭包的函数式编程特性;Box<T>智能指针在堆上存储数据,Rc<T>智能指针开启多所有权模式等;理解并发,如何安全的使用线程,共享数据。自动化测试编写测试以方便我们在后续的迭代过程中,不会改坏代码。保证了程序的......
  • 图文详解宝塔centos7安装Conda的步骤
    在centos7上安装anaconda碰到很多的坑,分享出来,也免得以后自己忘记,下面这篇文章主要给大家介绍了关于宝塔centos7安装Conda的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下 前言:最近学习了python,主要原因是公司主营百度相关业务,接触了一下paddleAi开发套......
  • 万字长文全面详解现代C++智能指针:原理、应用和陷阱
    现代C++智能指针详解:原理、应用和陷阱智能指针是C++11引入的新特性。本篇文章详细介绍了C++智能指针的原理、应用与陷阱,通过丰富的代码实例介绍了三种智能指针:std::unique_ptr、std::shared_ptr和std::weak_ptr的原理、使用方法和适用场景,还介绍了智能指针的线程安全性、使用陷阱......
  • 第七节:图结构详解
    一.        二.        三.         !作       者:Yaopengfei(姚鹏飞)博客地址:http://www.cnblogs.com/yaopengfei/声     明1:如有错误,欢迎讨论,请勿谩骂^_^。声     明2:原创博客请在转载......
  • Unity3D 如何制作带厚度的透明图片详解
    Unity3D是一款功能强大的游戏开发引擎,可以实现各种复杂的游戏效果。本文将详细介绍如何使用Unity3D制作带厚度的透明图片,并提供代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。在Unity3D中,......
  • Unity3D 关于过大的UI帧动画如何处理详解
    Unity3D是一款流行的游戏开发引擎,它可以用来创建各种类型的游戏,包括2D和3D游戏。在游戏中,UI帧动画是一个常见的元素,它可以增加游戏的交互性和视觉效果。然而,当UI帧动画过大时,可能会导致游戏的性能下降和卡顿现象。本文将详细介绍如何处理过大的UI帧动画,并给出相应的技术详解和代码......
  • Swin Transformer: Hierarchical Vision Transformer using Shifted Windows详解
    初读印象comment::(Swin-transformer)代码:https://github.com/microsoft/Swin-Transformer动机将在nlp上主流的Transformer转换到cv上。存在以下困难:nlp中单词标记是一个基本单元,但是视觉元素在尺度上有很大的变化。图像分辨率高,自注意力操作计算复杂度是图像大小的二次方......