通用二进制搜索 - JAVA -

时间:2016-09-08 11:50:27

标签: java generics binary-search comparable

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

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

enter image description here enter image description here

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

我的代码:

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

    }
}

2 个答案:

答案 0 :(得分:2)

这里有两个编译问题:

  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个实例。

  3. 但还有更多问题。

    • 您声明的变量为raw type。这基本上会关闭与该变量关联的编译器类型检查,这可能会导致类型错误。添加通用参数:

      BinarySearchGeneric<Integer> binarySearchGeneric = new BinarySearchGeneric<>();
      
    • 阵列和泛型并不能很好地协同工作。如果你宣布一个通用的,可比较的类,事情会开始变得有点混乱:

      class GenericComparable<T> extends Comparable<T> { ... }
      

      然后尝试声明一个GenericComparable s数组传递给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 {
        // ...
      }
      

答案 1 :(得分:1)

我没有看到BinarySearchGeneric类的用户定义构造函数,因此您的代码应该如下所示:

BinarySearchGeneric binarySearchGeneric = new BinarySearchGeneric();
System.out.println("BinarySearch Genetic: ", binarySearchGeneric(a, 8));