假设我有一个名为 Garlic parmesan butter
的食谱。找到合适的名称后,我需要返回一个对象。
现在在一个简单的临时解决方案中,我可以通过以下方式进行搜索:
class SearchRecipe {
late RecipeModel recipe;
RecipeModel returnRecipe(String? suggestion) {
for (int i = 0; i < Store.instance.getAllRecipes().length; i++) {
if (suggestion == Store.instance.getAllRecipes()[i].recipeName) {
return Store.instance.getAllRecipes()[i];
}
}
return recipe;
}
}
但我需要一种简单的方法,如果用户输入 Garlic butter
,我需要返回与 Garlic Paremesan butter
关联的对象。
我该怎么做?
编辑:我应该澄清我正在处理一个对象列表。所以 Store.instance.getAllRecipes()
基本上返回一个 List<RecipeModel>
。
更新 1:这是我写的:
class SearchRecipe {
//late RecipeModel recipe;
RecipeModel returnRecipe(String? suggestion) {
List<RecipeModel> results = [];
suggestion!.split(' ').forEach((s) {
results.addAll(Store.instance
.getAllRecipes()
.where((element) => element.recipeName!.contains(s)));
});
results = results.toSet().toList();
for (int i = 0; i < results.length; i++) {
return results[i];
}
return results[0];
}
}
答案 0 :(得分:2)
String search = 'Garlic butter';
List<String> list = [
'Garlic Paremesan butter',
'Butter',
'Garlic',
'Butter Garlic',
'Paremesan',
'Stackoverflow'
];
List<String> results = [];
search.split(' ').forEach((s) {
results.addAll(list.where((element) => element.contains(s)));
});
// Avoid repeated values
results = results.toSet().toList();
答案 1 :(得分:0)
在空格处拆分用户输入。然后你有一个清单。您可以查看列表并根据您的喜好实施各种行为。
如果找到列表中的所有单词,则可以匹配。如果至少匹配一个词,您可以返回。
您可以优先选择更多包含的单词,也可以检查单词的顺序。
在任何一种情况下,您也不会检查相等性,而是使用包括/包含之类的函数来检查搜索的单词是否是名称的一部分。
(可以通过记住您已经识别的单词并仅搜索找到的单词来检查顺序。在您的示例中,您会找到“garlic”,然后您只需查看“paremesan Butter”并尝试找到“黄油”)
答案 2 :(得分:0)
首先分割输入文本
var string = "Hello world!";
string.split(" ");
// ['Hello', 'world!'];
然后遍历上面数组中的每个单词并检查上面的是否为
Store.instance.getAllRecipes()[i].recipeName 包含以上单词。
if(str.equalsIgnoreCase(str))
{
//remaining code
}
尝试包含方法。
.contains()