2016-09-08 4 views
0

Я не знаю, является ли функциональность моего кода правильной для двоичного поиска. Но это не мой вопрос, я хочу решить его сам.Общий двоичный поиск - JAVA -

Моя проблема заключается в проверке его функциональности в то время как я получаю следующие ошибки:

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

    } 
} 
+1

Не вопрос, но рассмотрим, что generics и массивы не являются дружественными bedfellows.Посмотрите на 'List ', а не на 'T []'. –

+2

У вас не может быть дженериков с примитивными типами. Используйте 'Integer []' вместо 'int []' . –

+0

Также: не используйте необработанные типы: 'BinarySearchGeneric '. –

ответ

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 экземпляров.


Но есть еще вопросы.

  • Вы объявляете переменную raw type. Это в основном отключает проверку типа компилятора, связанную с этой переменной, что делает вероятным, что вы сделаете ошибку типа. Добавить общие параметры:

    BinarySearchGeneric<Integer> binarySearchGeneric = new BinarySearchGeneric<>(); 
    
  • Массивы и дженерики не очень хорошо играть вместе. Все было бы начать получить немного грязным, если вы объявили общий, сравнимый класс:

    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 { 
        // ... 
    } 
    
1

Я не вижу определенный пользователем конструктор для BinarySearchGeneric класса, так что ваш код должен выглядеть следующим образом:

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

Ах, черт возьми, спасибо, у меня был конструктор раньше и не изменил его. Теперь я сделал, но вторая ошибка все еще существует. –

+1

@JavaMan вторая ошибка исправлена ​​с помощью 'Integer []'. –