根据字符匹配百分比对搜索结果进行排序

Sort Search Results based on character match percentage

我有一个搜索栏和一个 tableView,我在其中根据在搜索栏中键入的文本更新 tableview 行。下面是我用来将搜索到的文本与变量 productTagsArray 中的值相匹配的代码。一切正常,结果毫无问题地填充到我的 searchResults 变量中。

var productTagsArray : [[String : [String]]] = [[:]]
var searchResults: [[String : [String]]] = [[:]]

func filterContent(for SearchText: String){

    searchResults = productTagsArray.filter({ (productTagsArray) -> Bool in
        for product in productTagsArray {
            if let tags = product.value as? [String] {
                for tag in tags {
                    let isMatch = tag.localizedCaseInsensitiveContains(SearchText)
                    return isMatch
                }
            }
            return false
        }
        return false
    })
}

func updateSearchResultsSearchBar(for searchController: UISearchBar) {
    if let searchText = searchBar.text{
        filterContent(for: searchText)
        tableView.reloadData()
    }
}

现在我需要改进填充到变量 searchResults 中的结果。我想根据 percentage of the total characters matching 对其进行排序。因此,如果 SearchTexttag 匹配 80%,而另一个标签与 SearchText 匹配 50%。我希望 sorted searchResults 将匹配率较高的那个存储在匹配率较低的那个之前。

示例:

SearchTextTomato(6 个字符)

tag1Organic Tomato(14 个字符,包括 space)

tag2Organic Small Tomato(20 个字符,包括 space)

tag1 字符匹配率为 43% (6/14 = 43%)

tag2字符匹配率为30%(6/20 = 30%)

现在我想根据百分比对 searchResults 进行排序,因此 tag1 排在第一位,tag2 排在第二位。

注意:有很多标签

这是排序前的搜索结果:

searchResults: [["1" : [Organic Small Tomato, Organic, Small, Tomato]], ["2" : [Organic Tomato, Organic, Tomato]]]

这是排序后的搜索结果(我要找的结果):

searchResults: [["2" : [Organic Tomato, Organic, Tomato]], ["1" : [Organic Small Tomato, Organic, Small, Tomato]]]

这个排序的逻辑应该是根据我上面解释的seachText的匹配百分比。因为有机番茄有43%,有机小番茄高于30%;那么 searchResults 中的 Organic index 应该从 1 变为 0。

您可以简单地根据第一个键值的第一个字符串的字符数对字典数组进行排序:

searchResults.sort { 
    [=10=].first?.value.first?.count ?? 0 < .first?.value.first?.count ?? 0
}