我不知道我的代码的功能是否适合二进制搜索,但是这不是我的问题,我想自己解决。
我的问题是在测试它的功能时遇到以下错误:
我真的不知道该如何解决这个问题。请帮我!
我的代码:
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
使用参数的构造函数,但是您正在尝试传递参数。去掉它:
BinarySearchGeneric binarySearchGeneric = new BinarySearchGeneric();
int[]
对于期望使用数组的泛型方法来说,它不是可接受的参数,因为int
它是原始类型,而不是引用类型,因此不能在泛型中使用。解决方案是简单地声明一个数组Integer
,而不是int
:
Integer[] a = {1,2,3,4,5,6,7,8,9,10};
编译器Integer
自动将这些int文字转换为实例。
但是还有更多的问题。
您正在声明原始类型的变量。基本上,这会关闭与该变量关联的编译器的类型检查,从而可能会导致类型错误。添加通用参数:
BinarySearchGeneric<Integer> binarySearchGeneric = new BinarySearchGeneric<>();
数组和泛型不能很好地结合在一起使用。如果您声明一个通用的,可比较的类,事情就会开始变得有些混乱:
class GenericComparable<T> extends Comparable<T> { ... }
然后尝试声明GenericComparable
要传递给的的数组binarySearchGeneric
,因为您不能直接创建通用数组。
简单地避免数组,而使用aList<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 {
// ...
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句