JavaRush /Java 博客 /Random-ZH /喝咖啡休息#156。如何在 Java 中使用 Arrays.binarySearch() 方法

喝咖啡休息#156。如何在 Java 中使用 Arrays.binarySearch() 方法

已在 Random-ZH 群组中发布
来源:FreeCodeCamp 通过本文,您将学习如何在 Java 中使用 Arrays.binarySearch() 方法。 喝咖啡休息#156。 如何在 Java 中使用 Arrays.binarySearch() 方法 - 1

Java 中的 Arrays.binarySearch() 是什么?

Arrays.binarySearch()方法的官方文档指出:
  • 此方法使用二分搜索算法在指定的字节数组中搜索指定的值。
  • 在调用之前必须对数组进行排序(使用sort(byte[])方法)。如果不排序,则结果无法确定。
  • 如果数组包含多个具有指定值的元素,则无法保证会找到哪一个。
简单来说,Arrays.binarySearch()方法可以在排序数组中搜索给定元素,如果找到则返回其索引。
import java.util.Arrays;

public class Main {

	public static void main(String[] args) {
		char vowels[] = {'a', 'e', 'i', 'o', 'u'};

		char key = 'i';

		int foundItemIndex = Arrays.binarySearch(vowels, key);

		System.out.println("The given vowel is at index: " + foundItemIndex);

	}
}
Arrays.binarySearch() 方法将要搜索的数组作为第一个参数,将要搜索的键作为第二个参数。上述程序的输出将是:
给定的元音位于索引:2
请记住,该方法返回找到的元素的索引,而不是元素本身。通过这种方式,您可以将索引存储为整数,就像本例中使用的那样。默认情况下,该方法使用数组的第一个索引作为搜索的起点,使用数组的长度作为搜索的终点。在本例中,起始索引为 0,结束索引为 6。您可以自己定义它们,而不是使用默认的起始索引和结束索引。例如,如果要从索引 2 搜索到索引 4,可以这样做:
import java.util.Arrays;

public class Main {

	public static void main(String[] args) {
		char vowels[] = {'a', 'e', 'i', 'o', 'u'};

		char key = 'i';
		int startIndex = 2;
		int endIndex = 4;

		int foundItemIndex = Arrays.binarySearch(vowels, startIndex, endIndex, key);

		System.out.println("The given vowel is at index: " + foundItemIndex);

	}
}
在本例中,Arrays.binarySearch()方法将要搜索的数组作为第一个参数,起始索引作为第二个参数,结束索引作为第三个参数,键作为第四个参数。只要将结束索引保持在数组的长度内,该方法就应该可以正常工作。但如果超过它,就会得到Array index out of range异常。这很简单,对吧?如果找到该元素,该方法将返回该元素的索引。但是如果找不到给定的元素会发生什么?

当 Arrays.binarySearch() 找不到给定元素时会发生什么?

让我们再看一下Arrays.binarySearch()方法的官方文档
  • 如果某个键包含在指定范围内的数组中,则该方法查找该键在搜索结果中的索引;否则我们得到(-(插入点) - 1)
  • 插入点定义为将键插入数组的点:范围中第一个元素的索引大于键,如果范围中的所有元素都小于键,则为 toIndex(结束索引)指定的键。
  • 注意,只有找到 key 时,返回值才会大于或等于 0。
不是很清楚,对吧?第一行指出,如果在数组中找到该键,该方法将从搜索中返回该键的索引。如果未找到,则输出将等于值(-(插入点) - 1)。根据搜索键的不同,插入点可以具有不同的含义。假设我们有一个数组[5, 6, 7, 8, 9, 10]和搜索键0,这显然不在数组中。在这种情况下,搜索键小于数组的所有元素。但大于搜索键的第一个元素是5。因此,在我们的例子中,插入点将是:
(-(第一个大于搜索关键字的元素的索引) - 1) = (0 - 1) = -1
您可以在如下代码片段中实现此功能:
package arrays;

import java.util.Arrays;

public class Main {

	public static void main(String[] args) {
		int numbers[] = {5, 6, 7, 8, 9, 10};

		System.out.println(Arrays.binarySearch(numbers, 0)); // -1
	}
}
我们再次假设我们有一个数组[5, 6, 7, 8, 9, 10]和搜索键12,它显然不在数组中。在这种情况下,搜索键大于数组的所有元素。这里的插入点将是这样的:
(-(结束索引 (-(6) - 1) = (-6 - 1) = -7
请记住,如果您不手动指定结束索引,该方法将使用数组的长度作为结束索引,在本例中为6。您可以在如下代码片段中实现此功能:
import java.util.Arrays;

public class Main {

	public static void main(String[] args) {
		int numbers[] = {5, 6, 7, 8, 9, 10};

		System.out.println(Arrays.binarySearch(numbers, 12)); // -7
	}
}
但是,如果您手动定义开始和结束索引,结果将会改变:
import java.util.Arrays;

public class Main {

	public static void main(String[] args) {
		int numbers[] = {5, 6, 7, 8, 9, 10};

		int startIndex = 1;
		int endIndex = 3;

		System.out.println(Arrays.binarySearch(numbers, startIndex, endIndex, 5)); // -2
		System.out.println(Arrays.binarySearch(numbers, startIndex, endIndex, 10)); // -4

	}
}
尝试自己计算这些值。您还可以使用带有如下符号的 Arrays.binarySearch()方法:
import java.util.Arrays;

public class Main {

	public static void main(String[] args) {
		char vowels[] = {'a', 'e', 'i', 'o', 'u'};

		char key = 'i';
		int startIndex = 2;
		int endIndex = 4;

		System.out.println(Arrays.binarySearch(vowels, startIndex, endIndex, key));

	}
}
如果未找到指定的搜索关键字,则适用相同的原则。但是,当比较数组中的字符和给定的搜索键时,将使用相应字符的 ASCII 代码。也就是说,A (65)将小于a (97)。在交叉检查程序的输出时请考虑到这一点。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION