颤振中的多词搜索

时间:2021-06-05 18:02:32

标签: algorithm flutter dart

假设我有一个名为 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];
  }
}

3 个答案:

答案 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()