2014-02-21 3 views
1

Нужно ли искать двоичный массив объектов, а не для полного элемента массива, а для элемента, содержащего определенное значение поля? В настоящее время единственный способ сделать это - создать новый объект «Entry» для поиска - и из-за реализации compareTo не имеет значения, что содержит второе поле «intial».Бинарный поиск массива объектов для поля элемента

Есть ли способ реализовать двоичный поиск, чтобы я мог просто искать поля surname.element напрямую - учитывая, что массив уже отсортирован по фамилии?

Я знаю, что я мог проходить через массив, который ищет поля каждого элемента, но в этом случае мне нужно использовать binarySearch.

public class Entry implements Comparable<Entry> { //implements allows sorting 
    public String surname; 
    public char intial; 

public Entry(String surname, String initial, int number) { 
    this.surname = surname.toUpperCase(); 
    this.intial = initial.toUpperCase().charAt(0); // if whole name entered 
                //takes first letter only 

} 

@Override 
public int compareTo(Entry o) { 

    else { 
     return this.surname.compareTo(o.surname); 
    } 

} 

public class EntryList { 

    public static main(String[] args) { 

    List<Entry> directory = new ArrayList<Entry>(); 

    directory.add(new Entry("surname", "intial")); 
      int i = Collections.binarySearch(directory, new Entry("surname", " ")); //doesnt matter whats in intial field 
    } 
} 


} 

ответ

2

Ваш вопрос не имеет большого смысла.

Бинарные поисковые работы по сортировке коллекции, поэтому, конечно, ваш элемент должен быть сопоставим. Определите свои методы compareTo и equals, чтобы рассмотреть только поле surname, а затем вы можете использовать binarySearch.

EDIT: Я до сих пор не уверен, вы спрашиваете о использования функции библиотеки binarySearch или о реализации пользовательских бинарной функции поиска.

В первом случае ответ отрицательный, в API нет такой перегрузки binarySearch. Как правило, в массиве, который вы хотите искать по принципу сущности, поскольку в предполагаемом варианте использования этого метода у вас уже есть объект, который вы ищете, но вы не знаете, содержится ли он в целевом массиве и по какому индексу может быть найден. Однако вы хотите искать объект по ключу, который может подписать, что вы неправильно используете ArrayList и binarySearch; a SortedMap будет лучше подходит для этой задачи.

С другой стороны, если вы будете придерживаться ArrayList, чем, конечно, вы можете реализовать себя метод, как бинарный поиск, который использует только ваше surname поле для сравнения.

+0

Спасибо за ваш комментарий - особенно о бесполезной строке кода. Чтобы перефразировать плохо сформулированный вопрос (извинения за это) - при условии, что методы equals и compareTo уже перезаписаны, чтобы рассматривать только поле «фамилия», существует ли способ реализации .binarySearch w/out, создающего новый объект Entry как второй аргумент? – davidhood2

+0

@ davidhood2 Отредактировал свой ответ в ответ. – poroszd

+0

@poroszd Вместо того чтобы реализовать бинарный поиск напрямую, вы могли бы вместо этого реализовать метод, который является фасад для 'binarySearch' в стандартной библиотеке. Метод будет использовать частный конструктор, который инициализирует объект только полями, используемыми при сравнении, а затем вызывает двоичный поиск. Или я чего-то не хватает? – Wrap2Win

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