Java Arrays.binarySearch()的应用及实例
Arrays.binarySearch()| Set 1 涵盖了在Java中如何在一个排序的数组中找到一个元素。本集将涵盖 “如何在一个给定的范围内搜索数组中的一个键,其中只包括起始索引”。
语法:
public static int binarySearch(data_type[] arr, int fromIndex, int toIndex, data_type key)
参数:
arr – 要搜索的数组
fromIndex - 要搜索的第一个元素的索引(包括)。
toIndex - 要搜索的最后一个元素的索引(不包括)。
key – 要搜索的值
- 这是java中 Arrays(java.util.Arrays) 类中定义的一个静态内置方法,返回在指定范围内找到的指定键的索引。
- 这里, data_type 可以是任何一种 原始数据类型 :byte, char, double, int, float, short, long和Object。
- 上述函数使用二进制搜索算法在给定数据类型的指定数组范围内搜索指定的键。
- 在进行这个调用之前,必须对指定键的范围进行排序(如Arrays.sort()方法)。否则,结果将是未定义的。如果指定的数组包含多个与指定键相同的值,不保证哪一个会被找到。
返回:
在指定数组的指定范围内找到指定键的索引,否则(-(插入点)-1)。
插入点被定义为插入指定键的点:范围内第一个大于键的元素的索引,如果范围内的所有元素都小于指定的键,则为toIndex。
注意:这保证当且仅当键被找到时,返回值将>=0。
例子
byteArr[] = {10,20,15,22,35}。
key=22,在指定数组的2到4的范围内搜索。
输出。3
charArr[] = {‘g’, ‘p’, ‘q’, ‘c’, ‘i’}
key = p,在指定数组的1到4的范围内搜索。
输出。3
intArr[] = {1,2,3,4,5,6}。
key = 3,在指定数组的1到4的范围内搜索。
输出。2
doubleArr[] ={10.2,1.51,2.2,3.5}
key = 1.5,在指定数组的1到4范围内进行搜索。
输出。-2,因为它是1.5的插入点。
floatArr[] = {10.2f,15.1f,2.2f,3.5f}。
key = 35.0,在指定数组的1到4的范围内进行搜索。
输出。-5
shortArr[] = {10,20,15,22,35}。
key = 5,在指定数组的0到4范围内进行搜索。
输出。-1
实现:
// Java program to demonstrate working of binarySearch()
// method for specified range in a sorted array.
import java.util.Arrays;
public class GFG {
public static void main(String[] args)
{
byte byteArr[] = { 10, 20, 15, 22, 35 };
char charArr[] = { 'g', 'p', 'q', 'c', 'i' };
int intArr[] = { 1, 2, 3, 4, 5, 6 };
double doubleArr[] = { 10.2, 15.1, 2.2, 3.5 };
float floatArr[] = { 10.2f, 15.1f, 2.2f, 3.5f };
short shortArr[] = { 10, 20, 15, 22, 35 };
Arrays.sort(byteArr);
Arrays.sort(charArr);
Arrays.sort(intArr);
Arrays.sort(doubleArr);
Arrays.sort(floatArr);
Arrays.sort(shortArr);
byte byteKey = 22;
char charKey = 'p';
int intKey = 3;
double doubleKey = 1.5;
float floatKey = 35;
short shortKey = 5;
System.out.println(
byteKey + " found at index = "
+ Arrays.binarySearch(byteArr, 2, 4, byteKey));
System.out.println(
charKey + " found at index = "
+ Arrays.binarySearch(charArr, 1, 4, charKey));
System.out.println(
intKey + " found at index = "
+ Arrays.binarySearch(intArr, 1, 4, intKey));
System.out.println(doubleKey + " found at index = "
+ Arrays.binarySearch(
doubleArr, 1, 4, doubleKey));
System.out.println(floatKey + " found at index = "
+ Arrays.binarySearch(
floatArr, 1, 4, floatKey));
System.out.println(shortKey + " found at index = "
+ Arrays.binarySearch(
shortArr, 0, 4, shortKey));
}
}
输出
22 found at index = 3
p found at index = 3
3 found at index = 2
1.5 found at index = -2
35.0 found at index = -5
5 found at index = -1
异常。
- IllegalArgumentException : 当起始索引(fromIndex)大于指定范围的结束索引(toIndex)时,会被抛出(意味着:fromIndex>toIndex)。
- ArrayIndexOutOfBoundsException :如果一个或两个索引都无效,即fromIndex<0或toIndex>arr.length,则抛出此问题。
重要的一点
- 如果输入的列表没有被排序,结果是不确定的。
- 如果有重复的,不保证哪一个会被找到。
参考资料:
https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#binarySearch(int[],%20int)