通用二进制搜索 - JAVA -
Generic Binary Search - JAVA -
我不知道我的代码的功能是否适用于二进制搜索但这不是我的问题,我想自己解决。
我的问题是在测试其功能时出现以下错误:
我真的不知道如何解决这个问题。请帮帮我!
我的代码:
public class BinarySearchGeneric<T extends Comparable<T>>{
public int search(T[] array, T element){
int start = 0;
int end = array.length - 1;
int mid = (start + end) / 2;
while(!element.equals(array[mid]) && end != 0) {
if (element.equals(array[mid])) {
return mid;
} else if (array[mid].compareTo(element) < 0) {
end = mid - 1;
mid = (start + end) / 2;
} else if(array[mid].compareTo(element) > 0){
start = mid + 1;
mid = (start + end) / 2;
}
}
return -1;
}
}
主要方法:
public class Main {
public static void main(String[] args) {
int[] a = {1,2,3,4,5,6,7,8,9,10};
BinarySearchGeneric binarySearchGeneric = new BinarySearchGeneric(a);
System.out.println("BinarySearch Generic: " + binarySearchGeneric.search(a, 8));
}
}
我没有看到 BinarySearchGeneric
class 的用户定义构造函数,因此您的代码应如下所示:
BinarySearchGeneric binarySearchGeneric = new BinarySearchGeneric();
System.out.println("BinarySearch Genetic: ", binarySearchGeneric(a, 8));
这里有两个编译问题:
BinarySearchGeneric
没有构造函数接受参数,但您正试图传递参数。删除它:
BinarySearchGeneric binarySearchGeneric = new BinarySearchGeneric();
int[]
不是期望数组的泛型方法可接受的参数,因为 int
是原始类型,而不是引用类型,因此不能用于泛型。解决方案是简单地声明一个 Integer
的数组,而不是 int
:
Integer[] a = {1,2,3,4,5,6,7,8,9,10};
编译器自动将这些 int 文字转换为 Integer
个实例。
但是还有更多的问题。
您正在声明 raw type 的变量。这基本上关闭了与该变量关联的编译器类型检查,使您很可能会出现类型错误。添加通用参数:
BinarySearchGeneric<Integer> binarySearchGeneric = new BinarySearchGeneric<>();
数组和泛型并不能很好地协同工作。如果你声明一个通用的、可比较的 class:
,事情就会开始变得有点混乱
class GenericComparable<T> extends Comparable<T> { ... }
然后尝试声明一个 GenericComparable
的数组以传递给 binarySearchGeneric
,因为您不能直接创建通用数组。
简单地避免数组并使用 List<T>
更容易:
public int search(List<T> array, T element){
您的行为可能不一致,因为您在搜索中混用了 equals
和 compareTo
。虽然 compareTo
应该与 equals
一致(在 a.compareTo(b) <=> a.equals(b)
的意义上,它不一定是正确的。
您可以仅使用 compareTo
:
使行为一致
int c = array[mid].compareTo(element);
if (c == 0) {
// ...
} else if (c < 0) {
// ...
} else {
// ...
}
我不知道我的代码的功能是否适用于二进制搜索但这不是我的问题,我想自己解决。
我的问题是在测试其功能时出现以下错误:
我真的不知道如何解决这个问题。请帮帮我!
我的代码:
public class BinarySearchGeneric<T extends Comparable<T>>{
public int search(T[] array, T element){
int start = 0;
int end = array.length - 1;
int mid = (start + end) / 2;
while(!element.equals(array[mid]) && end != 0) {
if (element.equals(array[mid])) {
return mid;
} else if (array[mid].compareTo(element) < 0) {
end = mid - 1;
mid = (start + end) / 2;
} else if(array[mid].compareTo(element) > 0){
start = mid + 1;
mid = (start + end) / 2;
}
}
return -1;
}
}
主要方法:
public class Main {
public static void main(String[] args) {
int[] a = {1,2,3,4,5,6,7,8,9,10};
BinarySearchGeneric binarySearchGeneric = new BinarySearchGeneric(a);
System.out.println("BinarySearch Generic: " + binarySearchGeneric.search(a, 8));
}
}
我没有看到 BinarySearchGeneric
class 的用户定义构造函数,因此您的代码应如下所示:
BinarySearchGeneric binarySearchGeneric = new BinarySearchGeneric();
System.out.println("BinarySearch Genetic: ", binarySearchGeneric(a, 8));
这里有两个编译问题:
BinarySearchGeneric
没有构造函数接受参数,但您正试图传递参数。删除它:BinarySearchGeneric binarySearchGeneric = new BinarySearchGeneric();
int[]
不是期望数组的泛型方法可接受的参数,因为int
是原始类型,而不是引用类型,因此不能用于泛型。解决方案是简单地声明一个Integer
的数组,而不是int
:Integer[] a = {1,2,3,4,5,6,7,8,9,10};
编译器自动将这些 int 文字转换为
Integer
个实例。
但是还有更多的问题。
您正在声明 raw type 的变量。这基本上关闭了与该变量关联的编译器类型检查,使您很可能会出现类型错误。添加通用参数:
BinarySearchGeneric<Integer> binarySearchGeneric = new BinarySearchGeneric<>();
数组和泛型并不能很好地协同工作。如果你声明一个通用的、可比较的 class:
,事情就会开始变得有点混乱class GenericComparable<T> extends Comparable<T> { ... }
然后尝试声明一个
GenericComparable
的数组以传递给binarySearchGeneric
,因为您不能直接创建通用数组。简单地避免数组并使用
List<T>
更容易:public int search(List<T> array, T element){
您的行为可能不一致,因为您在搜索中混用了
equals
和compareTo
。虽然compareTo
应该与equals
一致(在a.compareTo(b) <=> a.equals(b)
的意义上,它不一定是正确的。您可以仅使用
使行为一致compareTo
:int c = array[mid].compareTo(element); if (c == 0) { // ... } else if (c < 0) { // ... } else { // ... }