搜索结果返回的对象数量超过预期



我有一个Product对象列表,这些对象具有一个名为productName的属性。例如:

Product(
....
productName: "Red Shirt",
)
Product(
....
productName: "Yellow Scarf",
)
Product(
....
productName: "Trousers",
)

我想要什么:

  1. 当有人搜索红色围巾时,我需要展示两条红色裤子和黄色围巾

我当前的算法:

class Search {
/*
A hashmap is used to store the products.
Key: productName
Value: Product
*/
final Map<String, Product> _map = Map.fromIterable(
products,
key: (product) => product.productName,
);
List<Product> search(String search) {
List<String> searchWords = search.trim().toLowerCase().split(" ");
List<Product> result = [];
for (int i = 0; i < searchWords.length; i++) {
for (int j = 0; j < products.length; j++) {
if (products[j].productName!.toLowerCase().contains(searchWords[i])) {
result.add(products[j]);
}
}
}
return result.toSet().toList();
}
}

这个算法的问题是,当我输入Red S时,它也显示裤子,因为其中有S

我需要解决这个问题。

还有什么更好的算法可以用来降低时间复杂性?

N。B:映射不会执行任何操作。我只是觉得我可能需要它。

最优化的方法是使用RegExp,下面的代码将考虑您的一个单词必须以"开头;搜索词";,例如,对于Red S,它将搜索以reds:开头的任何单词

class Search {
Set<Product> search(String search) {
final searchWords = search.trim().split(" ");
final searchWordsRegExp = searchWords.formatToWordsRegExp();
return products.where((product) {
return product.productName.contains(searchWordsRegExp);
}).toSet();
}
}
extension FormatToWordsRegExpExtension on Iterable<String> {
RegExp formatToWordsRegExp({bool caseSensitive = false}) {
final buffer = StringBuffer();
for (final word in this) {
buffer.write(r'^' + word + r'|b' + word);
}
return RegExp(buffer.toString(), caseSensitive: caseSensitive);
}
}

用例

void main() {
final search = Search();
final words = ['Red S', 'red s', 'red', 'yellow', 'tro'];
for (final w in words) {
print('Search for "$w"');
search.search(w).showData();
print('--------------------');
}
}

输出

Search for "Red S"
Red Shirt
Yellow Scarf
--------------------
Search for "red s"
Red Shirt
Yellow Scarf
--------------------
Search for "red"
Red Shirt
--------------------
Search for "yellow"
Yellow Scarf
--------------------
Search for "tro"
Trousers
--------------------

试试DartPad 上的例子

最新更新