поиск по нескольким словам в flutter

#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() образом, в основном возвращается a 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];
  }
}
 

Комментарии:

1. вы пробовали .contains() ?

2. @pskink Я фактически интегрировал trie для сопоставления префиксов, и решение, которое вы предоставили, работает само по себе, но не с реализованным мной trie. Хотели бы вы это увидеть? Может быть, вы лучше поймете проблему, с которой я столкнулся?

3. @pskink другая проблема заключается в том, что я работаю со списком объектов, а не со списком строк, поэтому я думаю, что в этом случае я допустил некоторые ошибки

Ответ №1:

 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. не возвращаюсь Bengali Lamb curry , когда пишу Bengali curry . Я отредактировал свой пост, пожалуйста, дайте мне знать, правильно ли я это делаю

2. Просто сделал тест, и он отлично сработал. Напишите следующую функцию и попробуйте ее pastebin.com/ScGPMD5z

3. Привет @linesOfCode. Простите мою глупость. Но, как вы можете видеть, у меня есть список объектов, и прежде чем даже сопоставить имена рецептов с пользовательским запросом, я должен выполнить итерацию по recipe длине. Так что то, как вы написали свой код, похоже, не работает для меня. Есть какие-нибудь предложения по этому поводу?

4. Почему бы вам тогда не сделать простой for цикл из вашего Store.instance.getAllRecipes() и не поместить recipeName внутреннюю часть list переменной, которую я привел в качестве примера? Тогда все будет работать, как мой образец.

5. 1. Вам нужно применить некоторые критерии (рейтинг хороший) 2. Вы должны удалить (обрезать) все пробелы до и после.

Ответ №2:

Разделите вводимые пользователем данные на пробелы. Тогда у вас есть список. Вы можете проверить список и в зависимости от ваших предпочтений реализовать различные варианты поведения.

Вы можете сопоставить, если найдены все слова в списке. Вы можете вернуться, если хотя бы одно из слов совпадает.

Вы можете отдать предпочтение более содержательным словам или проверить порядок слов.

В любом случае вы также не будете проверять равенство, а будете использовать функцию, такую как includes / contains, чтобы проверить, является ли искомое слово частью имени.

(Проверка порядка может быть выполнена путем запоминания слов, которые вы уже определили, и поиска только по найденным словам. В вашем примере вы бы нашли «чеснок», а после этого просто просмотрели бы «Масло паремезана» и попытались найти «масло»)

Ответ №3:

сначала разделите вводимый текст

 var string = "Hello world!";
string.split(" ");  
// ['Hello', 'world!'];
 

затем повторите каждое слово в приведенном выше массиве и проверьте, соответствует ли приведенное выше
Store.instance.getAllRecipes()[i].Имя рецепта содержит указанное выше слово.

 if(str.equalsIgnoreCase(str))
{
      //remaining code
}
 

попробуйте метод contains.

 .contains()