我正在尝试对人员进行筛选和排列,并按特定顺序获取结果。这意味着当用户输入someString时,我想首先向人们展示其名称与someString匹配的人,然后以该someString开头,然后是包含该字符串的任何名称。
我可以使用“过滤器”数组执行任何操作,还是在此之后必须执行另一种手动排序?
这是我的过滤代码:
self.filteredNames = self.names.filter({$0.name.lowercaseString.hasPrefix(text!) | $0.name.lowercaseString.containsString(text!) | $0.allEmails.lowercaseString.containsString(text!.lowercaseString) | $0.allNumbers.lowercaseString.containsString(text!.lowercaseString)})
最佳答案
filter
只能从集合中删除项目。它无法为您执行任何订购操作。
您可能希望使用数组的一次传递来解决此问题,以便其表现良好。不要使用过滤器,而要做类似以下的基本操作:
var query = "test"
let allStrings = ["another test", "test", "testing", "random"]
var matchStrings = [String]()
var prefixStrings = [String]()
var containsStrings = [String]()
for str in allStrings {
if query == str {
matchStrings.append(str)
} else if str.hasPrefix(query) {
prefixStrings.append(str)
} else if str.containsString(query) {
containsStrings.append(str)
}
}
let results = matchStrings + prefixStrings + containsStrings