Нужно ли искать двоичный массив объектов, а не для полного элемента массива, а для элемента, содержащего определенное значение поля? В настоящее время единственный способ сделать это - создать новый объект «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
}
}
}
Спасибо за ваш комментарий - особенно о бесполезной строке кода. Чтобы перефразировать плохо сформулированный вопрос (извинения за это) - при условии, что методы equals и compareTo уже перезаписаны, чтобы рассматривать только поле «фамилия», существует ли способ реализации .binarySearch w/out, создающего новый объект Entry как второй аргумент? – davidhood2
@ davidhood2 Отредактировал свой ответ в ответ. – poroszd
@poroszd Вместо того чтобы реализовать бинарный поиск напрямую, вы могли бы вместо этого реализовать метод, который является фасад для 'binarySearch' в стандартной библиотеке. Метод будет использовать частный конструктор, который инициализирует объект только полями, используемыми при сравнении, а затем вызывает двоичный поиск. Или я чего-то не хватает? – Wrap2Win