通用二进制搜索-JAVA-

塞德里克·迈克尔(Cedric Michael)

我不知道我的代码的功能是否适合二进制搜索,但是这不是我的问题,我想自己解决。

我的问题是在测试它的功能时遇到以下错误:

在此处输入图片说明 在此处输入图片说明

我真的不知道该如何解决这个问题。请帮我!

我的代码:

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));

    }
}
安迪·特纳(Andy Turner)

这里有两个编译问题:

  1. 没有BinarySearchGeneric使用参数的构造函数,但是您正在尝试传递参数。去掉它:

    BinarySearchGeneric binarySearchGeneric = new BinarySearchGeneric();
    
  2. 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章