2015-03-30 6 views
0

Я пытаюсь использовать двоичный поиск в массиве объектов. Я использую объект, потому что для одного экземпляра у меня может быть набор строк или ints. Я в настоящее время застрял в реализации моего метода compareTo, не совсем уверен в следующем шаге. Вот то, что я до сих пор -Бинарный поиск CompareTo Java

public static int binarySearch(Object[] items, Comparable target, int first, int last){ 

    if(first > last) 
     return -1; // Base case for unsuccessful search 
    else{ 
     int middle = (first + last)/2; // Next probe index. 
     int compResult = target.compareTo(items[middle]); 
     if(compResult == 0) 
      return middle; // Base case for unsuccessful search. 
     else if (compResult <0) 
      return binarySearch(items, target, first, middle -1); 
     else 
      return binarySearch(items, target, middle + 1, last); 
    } 
} 
public static int binarySearch(Object[] items, Comparable target){ 
    return binarySearch(items, target, 0, items.length -1); 
} 
@Override 
public int compareTo(T obj) { 

    return 0; 
} 
public static void main(String[] args){ 
String[] names = {"Caryn", "Debbie", "Dustin", "Elliot", "Jacquie", "Jonathan", "Rich"}; 

    int myName = binarySearch(names, "Dustin"); 

я получаю ошибку, когда я называю BinarySearch это говорит Метод BinarySearch (Object [], Сопоставимые) в типе FiveThree не применяется для аргументов (String [], String). Я знаю его, потому что мой CompareTo пуст прямо сейчас, но я не знаю, как сделать «Dustin» или какой-либо параметр, который я ставил второй вместо Comparable. Также, если я бросаю объект перед именами, он распознает его только как объект, а не объект [].
Спасибо.

+0

Почему вы используете необработанные типы, а не дженерики? – RealSkeptic

+0

Я думаю, это плохо с моей стороны, поэтому я должен изменить его на что-то вроде List names = Arrays.asList («Caryn», «Debbie», «Dustin», «Elliot», «Jacquie», «Jonathan», «Rich «); – jumpman8947

+0

@ jumpman8947 № RealSkeptic означает, что вы не должны использовать необработанный тип 'Comparable'. Использование массива в порядке. –

ответ

0

Ваше решение существенно работает.

Я пытаюсь использовать двоичный поиск в объектном массиве. Я использую объект, потому что для одного экземпляра я могу иметь набор строк или INTS

Это говорит о том, вы должны использовать дженерики, а не Object[]. Если вы это сделаете, вам придется использовать Integer[], а не int[], потому что дженерики Java не работают для примитивных типов.

Нет необходимости писать метод compareTo, поскольку String и Integer уже внедрены Comparable.

Я заменил Object на T (где T extends Comparable<T>), и он просто сработал. Эта программа печатает 2, как и следовало ожидать.

public static <T extends Comparable<T>> int binarySearch(T[] items, T target, int first, int last){ 

    if(first > last) 
     return -1; // Base case for unsuccessful search 
    else{ 
     int middle = (first + last)/2; // Next probe index. 
     int compResult = target.compareTo(items[middle]); 
     if(compResult == 0) 
      return middle; // Base case for unsuccessful search. 
     else if (compResult <0) 
      return binarySearch(items, target, first, middle -1); 
     else 
      return binarySearch(items, target, middle + 1, last); 
    } 
} 

public static <T extends Comparable<T>> int binarySearch(T[] items, T target){ 
    return binarySearch(items, target, 0, items.length -1); 
} 

public static void main(String[] args) { 
    String[] names = {"Caryn", "Debbie", "Dustin", "Elliot", "Jacquie", "Jonathan", "Rich"}; 

    int myName = binarySearch(names, "Dustin"); 
    System.out.println(myName); 
} 
+0

Спасибо, я знал, что был близок. Я просто застрял, задаваясь вопросом, нужно ли делать какую-либо дополнительную реализацию на CompareTo, или мне пришлось что-то изменить. – jumpman8947

+0

Когда я пытаюсь исправить это на своем компьютере, я получаю «Метод binarySearch (T [], T) в типе FiveThree не применим для аргументов (String [], String)« По какой-то причине только его имена и " Дастин ", как только строки. – jumpman8947

+0

Приносим извинения, я написал интерфейс и назвал его сопоставимым, и это все испортило, я удалил его, и ваш код работает. Бесконечно благодарен. – jumpman8947