通用二进制搜索 - 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));

这里有两个编译问题:

  1. BinarySearchGeneric 没有构造函数接受参数,但您正试图传递参数。删除它:

    BinarySearchGeneric binarySearchGeneric = new BinarySearchGeneric();
    
  2. 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){
    
  • 您的行为可能不一致,因为您在搜索中混用了 equalscompareTo。虽然 compareTo 应该与 equals 一致(在 a.compareTo(b) <=> a.equals(b) 的意义上,它不一定是正确的。

    您可以仅使用 compareTo:

    使行为一致
    int c = array[mid].compareTo(element);
    if (c == 0) {
      // ...
    } else if (c < 0) {
      // ...
    } else {
      // ...
    }