对 dart 中字符串列表中的项目进行排名

问题描述

让我们考虑一个列表:

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 列表中。它不会对搜索查询中最匹配词的食谱进行排名。

我应该如何排名?我当前的代码可以修改吗?还是我需要彻底改变我的代码

解决方法

你需要修改你的方法

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')

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...