【问题标题】:Swift Full text search in tableview表格视图中的 Swift 全文搜索
【发布时间】:2020-09-07 23:20:11
【问题描述】:

我已经检查了 StackOverflow 没有找到我的查询的任何有效解决方案。

struct MyModel{
let title: String
let subTitle: String
let image: UIImage
}

现在我想搜索标题并输出它返回 mymodel 过滤器数组。 假设这是我的标题数组。

[
"Swift CollectionView Xcode 11",
"Swift UITableView Xcode 11",
"Swift UICollectionView Xcode 11",
"Objective C UITableView Xcode 11",
"Objective C CollectionView Xcode 11",
"Objective C UICollectionView Xcode 11",
]

如果我搜索 "collectionView" 那么,

“Swift UICollectionView Xcode 11”、“Swift CollectionView Xcode 11”- 正确

如果我搜索 "collectionview Objective C",我想要这个搜索结果,它会为我提供带有过滤器的整个数组

"Objective C CollectionView Xcode 11", “目标 C UICollectionView Xcode 11”, "Swift CollectionView Xcode 11", “Swift CollectionView Xcode 11”,

因为在搜索中它也包含collectionview 和objective c。首先,如果它包含整个字符串,则结果必须先显示给我,然后再显示其他。

我尝试过这种方法,但它不起作用

let stringComponent = searchText.components(separatedBy: " ")
_ = searchText.components(separatedBy: " ").map{ (str) in
            arrTemp += arrVideo.filter { (data) -> Bool in
                if data.title.lowercased().contains(str.lowercased()) && !arrTemp.contains(data){
                    return true
                }
                return false
}

还检查了NSPredicate, Sort and filter,但对我不起作用。

请帮帮我!谢谢。

【问题讨论】:

  • 您面临的主要问题是只正确排序???
  • 是排序,但我想要有问题的结果。
  • 现在检查答案已编辑......
  • 是的,请检查我在您的帖子上添加了评论。谢谢

标签: swift search filter tableview swift5


【解决方案1】:

检查下面的代码,它将根据最佳搜索结果对数组进行排序。

  let arr =  [
            "Swift CollectionView Xcode 11",
            "Swift UITableView Xcode 11",
            "Swift UICollectionView Xcode 11",
            "Objective C TableView Xcode 11",
            "Objective C CollectionView Xcode 11",
            "Objective C UICollectionView Xcode 11",
        ]

        //Sort the array and in dictioary according to search result
        let dups = Dictionary(grouping: self.serchedArray(arr: arr, isInsideCheck: true), by: {$0}).sorted { $0.1.count > $1.1.count }

        var resultArr2 : [String] = []
        for (_, value) in dups {
            resultArr2 = resultArr2 + self.serchedArray(arr: value, isInsideCheck: false)
        }

        let dups2 = Dictionary(grouping: resultArr2, by: {$0}).sorted { $0.1.count > $1.1.count }

        //Remove duplicate values from dictionary and map to array
        let finalArray = dups2.map { $0.value[0] }
        print(finalArray)

这个函数是为搜索而创建的

   func serchedArray(arr : [String], isInsideCheck:Bool) -> [String] {
        var resultArr : [String] = []
        let searchText = "collectionview Objective C"
        let _ = searchText.components(separatedBy: " ").map { (str) in
            let searchedArr = arr.filter( {
                if $0.lowercased().components(separatedBy: " ").contains(str.lowercased()) {
                    return true
                } else {
                    if isInsideCheck {
                        //Check any word is contained in array's element
                        let words = $0.lowercased().components(separatedBy: " ")
                        for word in words {
                            if word.count > 1 {
                                if word.contains(str){
                                    return true
                                } else if str.contains(word) {
                                    return true
                                }
                            }
                        }
                     }
                    return false
                }
            })
            //Merge the array with previous result
            resultArr = resultArr + searchedArr
        }
        return resultArr
    }

它将返回 Objective C CollectionView Xcode 11 作为 finalArray 中的第一个元素,因为它匹配所有三个单词,即 collectionviewObjectiveC

代码很长,因为我们在数组的每个元素中检查 searchString 的每个单词, 首先我们逐字检查,然后排序。

希望这会对你有所帮助..!!

【讨论】:

  • 嗨,如果我多次搜索它有时会起作用,那么它也会向我显示以前的值。你能检查一下并帮助我吗?谢谢
  • 我搜索 TableView 和第一个单元格,它向我显示 collectionview 记录?
  • 每当首先应用过滤器时,我都会删除我的数组,然后再应用您的代码。那就是它不是重复数据。现在它对我来说绝对没问题。谢谢!
【解决方案2】:

据我所知,问题是当您将字符串与空字符串“”分开时,会发生什么是关键字形成

- collectionview
- Objective
- C

并导致所有数据出现,因为“C”是一个单独的关键字。 我说所有数据都出现是真的吗?

【讨论】:

  • 是的,但它必须给我收集视图和目标的记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多