Java 在有序字符串数组中进行二进制搜索 ArrayIndexOutOfBoundsException
Java binary search in a ordered array of strings ArrayIndexOutOfBoundsException
我正在尝试在 Java 中实现递归二进制搜索算法。
我正在查找有序字符串数组中的字符串。
为什么我在输入“eeeeee”时得到 ArrayIndexOutOfBoundsException,
但不是“eeeee”?
提前致谢。
import java.util.Scanner;
class binarySearch{
public static boolean recursiveBinarySearch(String[] arr, String searchTerm, int start, int end){
int middle = start + (end-start)/2;
if(start > end){
return false;
}
if(arr[middle].equals(searchTerm)){
return true;
} else if(arr[middle].compareTo(searchTerm) > 0){
return recursiveBinarySearch(arr, searchTerm, start, middle-1);
} else if(arr[middle].compareTo(searchTerm) < 0){
return recursiveBinarySearch(arr, searchTerm, middle+1, end);
}
return false;
}
public static void main(String[] args){
Scanner console = new Scanner(System.in);
String[] saved = {"aaaa","bbbb","cccc","ddddd","eeeee"};
String searchTerm = "";
do{
System.out.println("Term to search in the ordered array:");
searchTerm = console.nextLine();
} while(searchTerm.equals(""));
console.close();
if(recursiveBinarySearch(saved, searchTerm, 0, saved.length)){
System.out.println("Term found!");
} else {
System.out.println("Term NOT found!");
}
}
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
您将 end
作为 saved.length
传递。这里的问题是 .length
会给你从 1
开始计算的长度,而数组使用 0
.
只需将 saved.length-1
作为 recursiveBinarySearch
中的 end
传入即可!
import java.util.Scanner;
class binarySearch{
public static boolean recursiveBinarySearch(String[] arr, String searchTerm, int start, int end){
int middle = start + (end-start)/2;
if(start > end){
return false;
}
if(arr[middle].equals(searchTerm)){
return true;
} else if(arr[middle].compareTo(searchTerm) > 0){
return recursiveBinarySearch(arr, searchTerm, start, middle-1);
} else if(arr[middle].compareTo(searchTerm) < 0){
return recursiveBinarySearch(arr, searchTerm, middle+1, end);
}
return false;
}
public static void main(String[] args){
Scanner console = new Scanner(System.in);
String[] saved = {"aaaa","bbbb","cccc","ddddd","eeeee"};
String searchTerm = "";
do{
System.out.println("Term to search in the ordered array:");
searchTerm = console.nextLine();
} while(searchTerm.equals(""));
console.close();
if(recursiveBinarySearch(saved, searchTerm, 0, saved.length-1)){
System.out.println("Term found!");
} else {
System.out.println("Term NOT found!");
}
}
}
数组索引从 0 到 4,你传递给它 saved.length,它的值为 5。它不会因“eeeee”而失败,因为代码在到达数组之前找到了数组中的项目错误。将行更改为 saved.length-1.
我正在尝试在 Java 中实现递归二进制搜索算法。
我正在查找有序字符串数组中的字符串。
为什么我在输入“eeeeee”时得到 ArrayIndexOutOfBoundsException, 但不是“eeeee”?
提前致谢。
import java.util.Scanner;
class binarySearch{
public static boolean recursiveBinarySearch(String[] arr, String searchTerm, int start, int end){
int middle = start + (end-start)/2;
if(start > end){
return false;
}
if(arr[middle].equals(searchTerm)){
return true;
} else if(arr[middle].compareTo(searchTerm) > 0){
return recursiveBinarySearch(arr, searchTerm, start, middle-1);
} else if(arr[middle].compareTo(searchTerm) < 0){
return recursiveBinarySearch(arr, searchTerm, middle+1, end);
}
return false;
}
public static void main(String[] args){
Scanner console = new Scanner(System.in);
String[] saved = {"aaaa","bbbb","cccc","ddddd","eeeee"};
String searchTerm = "";
do{
System.out.println("Term to search in the ordered array:");
searchTerm = console.nextLine();
} while(searchTerm.equals(""));
console.close();
if(recursiveBinarySearch(saved, searchTerm, 0, saved.length)){
System.out.println("Term found!");
} else {
System.out.println("Term NOT found!");
}
}
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
您将 end
作为 saved.length
传递。这里的问题是 .length
会给你从 1
开始计算的长度,而数组使用 0
.
只需将 saved.length-1
作为 recursiveBinarySearch
中的 end
传入即可!
import java.util.Scanner;
class binarySearch{
public static boolean recursiveBinarySearch(String[] arr, String searchTerm, int start, int end){
int middle = start + (end-start)/2;
if(start > end){
return false;
}
if(arr[middle].equals(searchTerm)){
return true;
} else if(arr[middle].compareTo(searchTerm) > 0){
return recursiveBinarySearch(arr, searchTerm, start, middle-1);
} else if(arr[middle].compareTo(searchTerm) < 0){
return recursiveBinarySearch(arr, searchTerm, middle+1, end);
}
return false;
}
public static void main(String[] args){
Scanner console = new Scanner(System.in);
String[] saved = {"aaaa","bbbb","cccc","ddddd","eeeee"};
String searchTerm = "";
do{
System.out.println("Term to search in the ordered array:");
searchTerm = console.nextLine();
} while(searchTerm.equals(""));
console.close();
if(recursiveBinarySearch(saved, searchTerm, 0, saved.length-1)){
System.out.println("Term found!");
} else {
System.out.println("Term NOT found!");
}
}
}
数组索引从 0 到 4,你传递给它 saved.length,它的值为 5。它不会因“eeeee”而失败,因为代码在到达数组之前找到了数组中的项目错误。将行更改为 saved.length-1.