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 : 对数据进行排序,其中关键字匹配最多的记录应先显示,然后再向最少的主要内容,如果未能解决你的问题,请参考以下文章

0821-TableView Cell

使用Swift查找用户是不是已经显示在TableView中[重复]

TableView里面的tableview cell swift 3

iOS tableview上的cell莫名消失

tableView和cell一些知识

iOS开发 点击cell后刷新tableview后回到tableView顶部了,怎么让他的位置不动啊,留在原来cell的位置