【问题标题】:rank items in list of string in dart对 dart 中字符串列表中的项目进行排名
【发布时间】:2021-06-14 07:51:35
【问题描述】:

让我们考虑一个列表:

List<String> recipeNamesList = [
  'Burger',
  'French Fries',
  'Pizza',
  'Bengali Lamb Curry',
  'Chingri Malai Curry',
]

如果用户搜索Bengali Lamb Fries,我需要返回Bengali lamb curryFrench Fries

Benagli Lamb Curry 的排名最高,因为它有 2 个匹配的单词,而French Fries 只有一个匹配的单词。

所以返回的列表会是这样的:

List<String> result = [
  'Bengali Lamb Curry',
  'French Fries'
]

我当前的代码:

  Future<List<String>> getSuggestions(String search) async {
    List<String> results = [];
    List<String> searchSplit =
        search.toLowerCase().split(" "); // split the search query

    for (int i = 0; i < searchSplit.length; i++) {
      // iterate over search query
      for (int j = 0; j < recipeNamesList.length; j++) {
        // iterate over the recipe names list
        List<String> recipeNamesListSplit =
            recipeNamesList[j].split(" "); // split the recipe names
        for (int k = 0; k < recipeNamesListSplit.length; k++) {
          // iterate over the list of splitted name
          if (recipeNamesListSplit[k]
              .toLowerCase()
              .startsWith(searchSplit[i])) {
            // convert to lower case and check if the query is present in splitted name
            results
                .add(recipeNamesList[j]); // if contains == true add to results
          }
        }
      }
    }

    // Avoid repeated values
    results = results.toSet().toList();
    return results;
  }

这是一个完全临时的,仅当查询词出现在recipeNamesList 中时才匹配。如果是这样,请将它们添加到 results 列表中。它不会对哪个食谱与搜索查询中的匹配词最多进行排名。

我应该如何排名?我当前的代码是否可以修改?还是我需要完全更改我的代码?

【问题讨论】:

    标签: algorithm flutter dart search ranking


    【解决方案1】:

    你需要修改你的方法为

    Future<List<String>> getSuggestions(String search) async {
      List<String> result = [];
      recipeNamesList.forEach((word){
        
        int value = getMatching(search,word);
        if(value > 0){
          if(result.isNotEmpty){
            if(getMatching(search,result[0]) > value){
              //only insert the maximum matched value at starting. it is some type of sorting
              result.add(word);
            }else{
              result.insert(0,word);
            }
          }else{
            result.add(word);
          }
        }
      });
    }
    

    一个计算完全匹配单词的基本函数

    int getMatching(String input, String word){
       List<String> inn = input.split(' ');
       List<String> words = word.split(' ');
       int temp = 0;
       inn.forEach((inWord){
         if(words.contains(inWord)){
           temp++;
         }
       });
       
       return temp;
     }
    

    输出与输入getSuggestions('Bengali Lamb Fries')

    【讨论】:

      猜你喜欢
      • 2012-10-04
      • 2021-06-20
      • 2014-04-15
      • 2019-10-20
      • 2018-07-02
      • 1970-01-01
      • 2015-03-26
      相关资源
      最近更新 更多