2015-09-11 1 views
0

У меня есть массив объектов, и объект содержит данные, такие как GoalsFor, GoalsAgainst и MatchPoints. Теперь у меня есть поиск и отображение данных с использованием метода двоичного поиска для заданных целей для целей или целейAgainst или MatchPoints. Я делаю класс бинарного поиска для выполнения операции поиска, но в настоящее время мне нужно сделать три из двух классов поиска по одному для каждого элемента данных объекта для трех операций. Есть ли способ, который я могу повторно использовать двоичный код поиска вместо копируя его три раза.Как повторно использовать этот код вместо копирования и вставки его снова и снова

Это проблема домашней работы, но я учусь, мои сомнения более общие. Constraint: Линейный поиск не допускается и не встроенной функции, кроме ввода/вывода могут быть использованы

public class BinarySearchPoints 
{ 
    public static void search(Teams arr[], int searchValue, int start , int end) 

    { 
    if(start > end) 
     return; 
    int mid = (end + start)/2; 
    if(searchValue == arr[mid].points) 
    { 
     System.out.print(arr[mid].toString()); 
     search(arr, searchValue, mid + 1, end); 
     search(arr, searchValue, start, mid - 1); 
    } 
    else if(searchValue < arr[mid].points) 
     { 
      search(arr, searchValue, mid + 1, end); 
     } 
    else 
     search(arr, searchValue, start, mid - 1); 

    } 
} 

единственное, что я меняюсь в других реализаций двоичного поиска используется goalsFor и целей в отношении вместо точек

+0

Вы можете реализовать свою двоичную логику поиска как функцию java, а затем вызвать эту функцию несколько раз – pradeep

+4

Можете ли вы показать этот код, который копируется трижды? –

+0

Пожалуйста, разместите одну копию своего двоичного кода поиска, чтобы было легче объяснить, что нужно изменить. – dasblinkenlight

ответ

0

Вы можете определенно обобщить свой двоичный метод поиска.

Первое, что нужно сделать, - это рассмотреть, что ваш бинарный поиск требуется из коллекции данных, переданных в него. Оказывается, единственное, что ему нужно - это способность сравнивать элемент данных со значением поиска.

Следующая вещь - придумать способ выразить сравнение абстрактным способом, например. как интерфейс. У вашего интерфейса будет единственный метод, который отвечает на вопрос «Где элемент X относительно данного номера»?

Вы можете выразить это в Java как универсальный интерфейс:

interface ElementComparator<E> { 
    // This assumes that you always search for an int property 
    int compare(E element, int value); 
} 

Ваш сравнить метод должен возвращать отрицательное значение, если атрибут E «s меньше V, положительное значение, если оно больше V, и ноль, если они равны. V должен реализовать интерфейс Comparable.

Теперь ваш метод binarySearch может быть определен следующим образом:

T binarySearch<E>(
    Collection<E> data 
, int value 
, ElementComparator<E> comparator 
) { 
    ... 
} 

Чтобы решить, стоит ли идти вправо или влево от середины вам нужно позвонить comparator.compare(data.get(mid), value); и проверить результат.

Теперь вы можете позвонить binarySearch так:

List<Teams> list = ... 
Teams fivePoints = binarySearch(list, 5, new ElementComparator<Teams>() { 
    public int compare(Teams element, int value) { 
     return Integer.compare(element.points, value); 
    } 
}); 
Teams fiveAgainst = binarySearch(list, 5, new ElementComparator<Teams>() { 
    public int compare(Teams element, int value) { 
     return Integer.compare(element.against, value); 
    } 
}); 

Обратите внимание, как сравнение обратного вызова подается в линию с вызовом: это где происходит волшебство - когда binarySearch реализация хочет сравнить Team с value, он вызывает compare, который, в свою очередь, вызывает Integer.compare по адресу element.points или element.against, в зависимости от обратного вызова.

Смежные вопросы