【发布时间】:2020-09-14 10:44:29
【问题描述】:
有一个国家名称列表,如果我搜索一个以 B 开头的国家,我如何将搜索拆分为所有以 B 开头的国家作为列表,其余国家作为另一个列表,然后合并两者都使带有“B”的国家/地区位于顶部
【问题讨论】:
有一个国家名称列表,如果我搜索一个以 B 开头的国家,我如何将搜索拆分为所有以 B 开头的国家作为列表,其余国家作为另一个列表,然后合并两者都使带有“B”的国家/地区位于顶部
【问题讨论】:
您可以使用sorted(by:) 来实现您的目标。您只需使用prefix 运算符检查当前元素和下一个元素是否以您的搜索词开头,如果当前元素确实以它开头,但下一个元素没有,则将当前元素排序在下一个元素之前,否则保留当前顺序。
extension Array where Element == String {
/// Sorts the array based on whether the elements start with `input` or not
func searchSort(input: Element) -> Array {
sorted(by: { current, next in current.hasPrefix(input) && !next.hasPrefix(input) })
}
}
["Austria", "Belgium", "Brazil", "Denmark", "Belarus"].searchSort(input: "B")
输出:["Belgium", "Brazil", "Belarus", "Austria", "Denmark"]
【讨论】:
搜索栏需要它吗?如果是,试试这个:
let filteredCountries = CountriesArray.filter({ (country: String) -> Bool in
return country.lowercased().contains(searchText.lowercased()) && country.hasPrefix(searchText)
})
另外,为了排序,试试这个:
let sortedArray = filteredCountries.sorted(by: { $0.lowercased() < $1.lowercased() })
即使您不需要它作为 searchBar,探索 filter() 方法,它也非常有用且易于使用。
【讨论】:
filteredCountries 成为一个可变变量,然后立即为其赋值?你可以做let filteredCountries = CountriesArray.filter...。此外,您的代码实际上并没有实现排序,只是过滤。
您也可以使用 Dictionary 进行拆分,它不会对键进行排序,但是您可以使用分隔的数组:
let a = ["FF0000", "000000", "0083FF", "FBE58D", "7A9EB0", "909CE1"]
let b = Dictionary(grouping: a, by: { $0.first! })
print(b) //["0": ["000000", "0083FF"], "7": ["7A9EB0"], "F": ["FF0000", "FBE58D"], "9": ["909CE1"]]
【讨论】: