Ich spüre zwei Fragen hier:
Die erste ist, wie die Suche auf dem HashSet auszuführen. Während 8000 Artikel nicht viel sind, könntest du etwas optimieren. Beginnen wir mit:
List<Item> getItemsMatchingSearch(final String searchString){
return mySet.parallelStream().filter((Item i)->i.getName().toLowerCase().contains(searchString.toLowerCase())).collect(Collectors.toList());
}
Dies wird durch den gesamten Satz gehen, aber auf mehreren Threads. Wenn Ihr Autocomplete-Feld jedoch nur mit einer gegebenen Zeichenfolge produzieren möchte, können Sie die Leistung noch weiter verbessern. Sortiere zuerst deinen Set
über das Namensfeld. Sie können dies tun, indem Sie Ihre Item
implementieren Comparable
.
class Item implements Comparable<Item>{
/*...*/
public int compareTo(Item other){
return this.name.compareToIgnoreCase(other.name);
}
}
Idealerweise verwenden Sie einen TreeSet
anstelle eines HashSet
die Elemente sortiert immer zu bekommen.
dann bei der Suche können Sie Schleife etwas wie folgt aus:
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;
}
Der zweite Teil der Frage ist REST verwandt. In Spring MVC, können Sie so etwas wie dies umzusetzen:
@RestController
public class SearchClass{
@RequestMapping("/path/to/domain")
public @ResponseBody List<Item> getAutocompleteResult(@RequestParam("search") String searchTerm){
/*... and here choose your favorite implementation*/
}
}
Beachten Sie, dass Sie einen Serializer benötigen, wie Jackson
auf Ihrem Weg List<Item>
in json (oder eine andere Form) zu transformieren. Der obige Code löst Anfragen an path/to/domain?search=foo
.
Versuch und Irrtum ist ein guter Ansatz. Was hast du bisher versucht? –
Ich habe keine Gedanken, wie jedes Objekt zu iterieren und zu suchen? Mein Hashset-Objekt enthält die rund 8000 Objekte. Also auf der Suche nach dem besten Ansatz – Maddy
Was ist Ihr Ansatz? hast du irgendein code probe sogar * prototyp *? – emotionlessbananas