我想要 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 的数组过滤器数组的主要内容,如果未能解决你的问题,请参考以下文章

Swift3.0 - 黑魔法swizzle

Swift3.0变化分享

swift3.0变化总结

第13月第10天 swift3.0

快速了解swift3.0

快速了解swift3.0