我想要 swift3.0 的 NSPredicate 的数组过滤器数组
Posted
技术标签:
【中文标题】我想要 swift3.0 的 NSPredicate 的数组过滤器数组【英文标题】:i want array filter array by NSPredicate of swift3.0 【发布时间】:2016-12-14 04:35:10 【问题描述】:我现在有个需求,这个需求是用NSPredicate
在另一个数组过滤器中使用一个数据数组。在 Object-C 中是这样工作的:
NSArray * arr1 = @[@1,@2,@3];
NSArray * arr2 = @[@2,@3,@4,@5];
NSPredicate * filterPredicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)",arr1];
NSArray * filter = [arr2 filteredArrayUsingPredicate:filterPredicate];
通过这种方法,我可以得到filter,这个数组中的元素不包含在arr1中。但是我在Swift 3.0上找不到相关方法。如果我能得到所有帮助,我将不胜感激
【问题讨论】:
在 Swift 中几乎没有理由使用NSArray
,而 NSPredicate
可以用更简单的设计代替,大多数时候
与几乎所有翻译案例(对于编程语言和人类语言)一样,不要尝试将每个单词换成对应的单词。相反,要理解短语的语义(含义),然后将其翻译成最适合新语言的新短语。它不一定与源短语完全相似,但会产生更好的结果。
【参考方案1】:
为此,您可以简单地使用filter
,而无需使用NSPredicate
。
let array1 = [1,2,3]
let array2 = [2,3,4,5]
let filterArray = array2.filter !array1.contains($0)
print(filterArray) // [4, 5]
编辑:正如@Alexander 建议的击球手,如果您也将 set 与array1
一起使用。
let array1 = [1,2,3,2,3]
let set = Set(array1)
let array2 = [2,3,4,5]
let filterArray = array2.filter !set.contains($0)
print(filterArray)
【讨论】:
@chenbo 注意,对于任何重要的数组大小,最好先将array1
转换为一个集合。它将这个 O(N^2) 算法加速到 O(N),从而大大提高性能。
@AlexanderMomchliov 很好的建议,但我认为contains
不会更进一步,如果它匹配第一个它将返回并且不检查剩余元素。
它确实做到了,但这并没有降低计算复杂度。假设一个均匀分布,其中所需元素同样可能位于数组的任何位置,平均而言,它会在中途找到(一些更早,一些更晚,但平均来说是一半)。那是array2.count / 2
搜索操作,重复array2.count
次(array2
的每个元素一轮,所以你得到O(array2.count / 2 * array2.count)
的总时间复杂度,即O(N^2)
@AlexanderMomchliov 已编辑答案,很好的解释:)
"Array(Set(array1))
" wut ಠ_ಠ以上是关于我想要 swift3.0 的 NSPredicate 的数组过滤器数组的主要内容,如果未能解决你的问题,请参考以下文章