Swift 根据字符匹配百分比对搜索结果进行排序
我有一个搜索栏和一个tableView,我在其中根据搜索栏中键入的文本更新tableView行。下面是我用来将搜索文本与变量Swift 根据字符匹配百分比对搜索结果进行排序,swift,sorting,search,full-text-search,uisearchbar,Swift,Sorting,Search,Full Text Search,Uisearchbar,我有一个搜索栏和一个tableView,我在其中根据搜索栏中键入的文本更新tableView行。下面是我用来将搜索文本与变量productTagsArray中的值匹配的代码。一切正常,结果填充到我的searchResults变量中,没有问题 var productTagsArray : [[String : [String]]] = [[:]] var searchResults: [[String : [String]]] = [[:]] func filterContent(for Sea
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
中的结果。我想根据匹配字符总数的百分比对其进行排序。因此,如果SearchText
与标记匹配80%,而另一个标记与SearchText
匹配50%。我希望排序的搜索结果
先存储匹配率较高的搜索结果,然后存储匹配率较低的搜索结果
例如:
SearchText
是Tomato
(6个字符)
tag1
是有机番茄
(包括空格在内的14个字符)
tag2
是有机小番茄
(20个字符,包括空格)
tag1字符匹配率为43%(6/14=43%)
tag2字符匹配率为30%(6/20=30%)
现在我希望根据百分比对搜索结果进行排序,因此tag1是第一位,tag2是第二位
注意:有很多标签
这是排序前的搜索结果:
searchResults: [["1" : [Organic Small Tomato, Organic, Small, Tomato]], ["2" : [Organic Tomato, Organic, Tomato]]]
这是排序后的搜索结果(我正在寻找的结果):
此排序的逻辑应该来自我上面解释的与seachText
匹配的百分比。因为有机番茄占43%,有机小番茄的比例高于30%;然后搜索结果中的有机索引应该从一变为零 您只需根据第一个键的值的第一个字符串的字符计数对字典数组进行排序:
searchResults.sort {
$0.first?.value.first?.count ?? 0 < $1.first?.value.first?.count ?? 0
}
searchResults.sort{
$0.first?value.first?count?0<$1.first?value.first?count?0
}
根据与问题无关的字符计数对结果元素进行排序,但您正在使用空字典初始化数组。我还将从其命名中删除数组var productTags:[[String:[String]]]]=[]
@LeoDabus您能分享一下我如何做到这一点的代码吗?我得到的数组计数实际上是错误的,但它应该是数组字符计数的第一个元素哦,对了!谢谢你让我知道。抢手货
searchResults.sort {
$0.first?.value.first?.count ?? 0 < $1.first?.value.first?.count ?? 0
}