更快捷的过滤方式?

时间:2017-11-16 15:11:42

标签: arrays swift algorithm filter

我有一个"Option"类型的数组。

班级Option包含元素optionDetail

班级optionDetail包含detailTraits元素,[String],每个字符串称为detailTraitName

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

我想将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 })

的选项

我目前的代码如下所示:

popHead()

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

希望这有帮助