#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()