Получение бинарного поиска Java Collections для возврата нескольких значений

Мне интересно, есть ли способ заставить двоичный поиск в Java возвращать несколько экземпляров значения. Например, у меня есть список элементов ArrayList, одно поле которого представляет собой массив ключевых слов String. Есть ли более быстрый способ, чем линейный поиск с использованием метода contains(), для извлечения элементов по ключевому слову и сохранения их в отдельной коллекции? Или строкой, такой как автор?

...Item...
private String[] keywords;
private String author;
...

person Flexo1515    schedule 05.08.2012    source источник
comment
Не могли бы вы быть более точным? Несколько значений в одном вызове... Вам может понадобиться написать оболочку, которая сохраняет вывод в массив и возвращает его.   -  person Bharat Sinha    schedule 05.08.2012
comment
Либо в одном вызове, либо я полагаю, используя несколько вызовов и какой-то возвращаемый флаг?   -  person Flexo1515    schedule 05.08.2012
comment
уточните вопрос пожалуйста   -  person Rahmathullah M    schedule 05.08.2012


Ответы (3)


Вы почти наверняка захотите иметь разные взгляды на одну и ту же коллекцию. Например, у вас может быть:

  • List<Book> из всех предметов
  • Multimap<String, Book> для поиска "по автору"
  • Multimap<String, Book> для поиска "по ключевому слову" (где одна и та же книга может появляться в нескольких записях)

Если бы я писал это, Multimap, вероятно, был бы реализацией в Guava, но доступны и другие.

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

person Jon Skeet    schedule 05.08.2012
comment
Хорошо, это то, что я думал и чего я пытался избежать. Я просто не был уверен, есть ли обходной путь. Спасибо - person Flexo1515; 05.08.2012
comment
@Jon Ты точно рано встаешь в воскресенье. ;) - person Peter Lawrey; 05.08.2012
comment
@PeterLawrey: У меня есть дети, и моя жена находится в лагере проводников :) - person Jon Skeet; 05.08.2012
comment
ржу не могу. Именно то, что я думал. Моему младшему 4,5 года. Я думаю, что ваш немного моложе. ;) - person Peter Lawrey; 05.08.2012
comment
@PeterLawrey: Нет, моим 8, 6 и 6... но они все еще встают в 7 утра. - person Jon Skeet; 05.08.2012
comment
Я своих научил меня не будить, ...пока не проголодаются... :) - person Peter Lawrey; 05.08.2012
comment
@PeterLawrey - подождите, пока они станут подростками ... и вы не сможете встать с постели :-) - person Stephen C; 05.08.2012
comment
@StephenC О да, моему старшему 14. ;) - person Peter Lawrey; 05.08.2012

Хотя я настоятельно рекомендую предложение JonSkeet, как только вы получите результат бинарного поиска, вы можете исследовать полученный индекс вперед и назад в поисках значений, которые больше не соответствуют вашим критериям, просто предложение;)

person MadProgrammer    schedule 05.08.2012
comment
Вот что я тоже собираюсь сделать. У меня есть отсортированная коллекция статей в двуязычном словаре, и есть повторяющиеся заглавные слова. - person Nate Glenn; 31.03.2013

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

person user949300    schedule 05.08.2012