TableView Cell -> UISearchBar : 对数据进行排序,其中关键字匹配最多的记录应先显示,然后再向最少
Posted
技术标签:
【中文标题】TableView Cell -> UISearchBar : 对数据进行排序,其中关键字匹配最多的记录应先显示,然后再向最少【英文标题】:TableView Cell -> UISearchBar : Sort Data, where the records which have most keywords matched should be shown first and then go towards the least 【发布时间】:2021-09-20 09:31:19 【问题描述】:搜索应根据匹配关键字的数量对结果进行排序。它应该在列表顶部显示最匹配的关键字结果,然后按降序排列其余记录。我有一个 UITableView,其中我已经实现了 UISearchBar,它将根据插入到搜索框中的查询来搜索我的 tableview 单元格。现在让我重新创建一个场景来解释它。假设我的 Api 获取了不同的键值数据,其中有一个名为“tags”的键,它将包含一串逗号分隔值,如“dog,cat,pug " 现在每当用户在搜索框中输入 dog 时,因为此值显示在我的 tableview 单元格之一中,它将显示为我的标签包含值 dog,如果我们再次 插入第二个关键字为cat 上面的记录需要被提取并显示在顶部,然后如果存在一个记录,其中一个标签值中只包含狗或猫作为标签值之一,那么它需要显示在之后它。第三个词也是如此。
查询 -> Cat Dog Pug
-
它应该只在顶部显示那些包含上述所有关键字的记录
之后,它应该显示存在上述任意两个值的记录
之后,如果存在上述关键字,则应显示单个记录。
请帮忙。
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)
print("\(searchText)")
let arrSearchTexts = searchText.components(separatedBy: " ")
filteredStorage = originalStorage1.filter (obj) -> Bool in
if let tags = obj["tags"] as? String
var hasTag = false
for searchedTag in arrSearchTexts
if tags.contains(searchedTag.lowercased())
hasTag = true
break
return hasTag //tags.contains(searchText.lowercased())
return false
//Sorting data
filteredStorage.sort (obj1, obj2) -> Bool in
if let tags1 = obj1["tags"] as? String
var hasAllTags = true
for tagVal in arrSearchTexts
if !tags1.contains(tagVal.lowercased())
hasAllTags = false
break
return hasAllTags
return obj1.contains (obj) -> Bool in
if let val = obj.value as? String,
let firstTag = arrSearchTexts.last
return val.hasPrefix(firstTag)
return false
if searchText == ""
filteredStorage = originalStorage1
tblView.reloadData()
【问题讨论】:
obj["tags"]
是 String
还是 [String]
?目前尚不清楚(名称表明它是一个数组,但您的代码说它是一个String
)。另外,你为什么用Dictionary
?为什么不适当的自定义struct
?这样就可以避免演员表了... 提供obj
的样本,它是如何构造的,等等。
obj["tags"] 是一个 [String],使用字典,因为我的数据来自 API,我需要存储它
obj["tags"]
是[String]
?你如何期望obj1["tags"] as? String
工作呢?此外,即使它来自 API,我们也会使用模型和自定义结构来促进它。我们解析 API 数据...我强烈建议您使用自定义结构,以后会更容易...
好的,谢谢你的建议!
【参考方案1】:
for i in 0..<filteredStorage.count
var dict = filteredStorage[i]
dict["priority"] = 0
filteredStorage[i] = dict
for i in 0..<filteredStorage.count
let tagInArr : String = filteredStorage[i]["tags"] as! String
var priorityInArr : Int = 0
for tagVal in arrSearchTexts
if tagInArr.contains(tagVal)
priorityInArr += 1
filteredStorage[i]["priority"] = priorityInArr
filteredStorage.sort
((($0 as Dictionary<String, AnyObject>)["priority"] as? Int)!) > ((($1 as Dictionary<String, AnyObject>)["priority"] as? Int)!)
【讨论】:
以上是关于TableView Cell -> UISearchBar : 对数据进行排序,其中关键字匹配最多的记录应先显示,然后再向最少的主要内容,如果未能解决你的问题,请参考以下文章
使用Swift查找用户是不是已经显示在TableView中[重复]
TableView里面的tableview cell swift 3
iOS开发 点击cell后刷新tableview后回到tableView顶部了,怎么让他的位置不动啊,留在原来cell的位置