чуя два вопроса:
Первым, как выполнить поиск по HashSet. В то время как 8000 предметов немного, вы можете немного оптимизировать. Начнем с:
List<Item> getItemsMatchingSearch(final String searchString){
return mySet.parallelStream().filter((Item i)->i.getName().toLowerCase().contains(searchString.toLowerCase())).collect(Collectors.toList());
}
Это будет проходить через весь комплект, но на несколько потоков. Если ваше поле автозаполнения, однако, хочет только производить элементы , начиная с с заданной строкой, вы можете улучшить производительность еще больше. Сначала соберите поле Set
по названию. Вы можете сделать это, сделав свой Item
инструмент Comparable
.
class Item implements Comparable<Item>{
/*...*/
public int compareTo(Item other){
return this.name.compareToIgnoreCase(other.name);
}
}
В идеале использовать TreeSet
вместо HashSet
, чтобы получить детали всегда отсортирован.
Затем при поиске, вы можете что-то вроде этого цикла:
List<Item> getItemsMatchingSearch(final String searchString){
List<Item> result = new LinkedList<>();
for(Item i:items){
if(i.getName().compareToIgnoreCase(searchString)>0){
break;
}
if(i.getName().toLowerCase().startsWith(searchString.toLowerCase()){
result.add(i);
}
}
return result;
}
Вторая часть вопроса связана с REST. В Spring MVC, вы можете реализовать что-то вроде этого:
@RestController
public class SearchClass{
@RequestMapping("/path/to/domain")
public @ResponseBody List<Item> getAutocompleteResult(@RequestParam("search") String searchTerm){
/*... and here choose your favorite implementation*/
}
}
Заметьте, что вы будете нуждаться в сериалайзер, такие как Jackson
на вашем пути, чтобы превратить List<Item>
в JSON (или другой формы). Вышеупомянутый код разрешит запросы к path/to/domain?search=foo
.
Испытание и ошибка - отличный подход. что ты уже испробовал? –
Я не понимаю, как итерации каждого объекта и поиска? Мой объект Hashset содержит около 8000 объектов. Ищем лучший подход – Maddy
Каков ваш подход? у вас есть образец кода даже * прототип *? – emotionlessbananas