arrays - 更快的过滤方式?

标签 arrays swift algorithm filter

我有一个“Option”类型的数组

Option包含一个元素optionDetail

optionDetail 类包含 detailTraits 的元素,它是一个 [String],每个字符串都称为 detailTraitName.

所以我获取detailTraits的结构看起来像Option -> optionDetail -> detailTraits这将返回我[String] ,或 Option -> optionDetail -> detailTraits -> detailTraitName,这只会返回我一个字符串

我想将 detailTraits 数组与另一个名为 selectedDetails 的数组(它是一个 [String])进行匹配并查找元素其中所有 selectedDetails 都包含在 detailTraits 内。然后我想返回所有符合这种情况的 Option

例如,如果我的 selectedDetails 数组包含 ["A", "B"],并且我有一个 detailTraits 数组,其中包含["A","C"] 和具有 ["A"] 的一个以及具有 ["A", "B", "C "],我只想返回 detailTraits["A", "B", "C"]

的选项

我当前的代码如下所示:

newOptions = option.filter({ $0.optionDetail?.detailTraits.filter({ selectedDetails.contains($0.detailTraitName ?? "") }).count == selectedDetails.count })

有更好的方法吗?这个算法看起来效率很低,因为它可能是 N^3 的数量级,但我想不出更好的方法来查看数组数组并将其与另一个数组匹配。

谢谢!

最佳答案

您可以通过首先比较 selectedDetailsdetailTraits 上的 count 进行过滤,然后比较实际值来对此进行优化。这样,选项集将减少到只有那些具有完全相同计数的 detailTraits。例如,您只需将字符串值与包含确切 3 个项目的数组进行比较(如果 selectedDetails["A", "B", "C"]),完全避免了循环中的一次迭代。

希望这有帮助

关于arrays - 更快的过滤方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47333097/

相关文章:

algorithm - 自上而下还是自下而上?

algorithm - Burrows-Wheeler 变换 (BWT) - 存储数据

javascript - 防止 Meteor 刷新时数组清空

java - 执行返回键而不是就地排序的搜索的技术

swift - 3D Touch 不在 CollectionView 中

ios - 快速在单元格问题中动态创建表格 View 按钮

algorithm - 在单独的列表中获取多项式的幂和系数

java - 你能像在 Matlab 中那样在 Java 中操作数组吗?

python - 用另一个数组索引一个 numpy 数组

objective-c - swift字典人口问题: type 'AnyObject' does not conform to protocol 'NSCopying'