【问题标题】:Faster Way to Filter?更快的过滤方式?
【发布时间】:2017-11-16 15:11:41
【问题描述】:

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

Option包含一个元素optionDetail

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

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

我想将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 的数量级上,但我想不出更好的方法来查看数组数组并将其与另一个数组匹配。

谢谢!

【问题讨论】:

  • 请编辑您的问题以添加Option 类的定义

标签: arrays swift algorithm filter


【解决方案1】:

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

希望对你有帮助

【讨论】:

  • 事先按字母顺序对detailTraits 进行排序很重要,这样您就可以简单地将selectedDetailsdetailTraits 开头的相同数量的项目进行比较。
  • 无论如何都要迭代N次。
  • 是的,但是如果项目是预先排序的,比较操作会被简化(例如,["A", "B", "C"]["A", "B", "C"] 是否相等?)。如果项目未预先排序,则每个比较操作必须首先确定元素是否相同但排序不同(例如["A", "B", "C"]["C", "B", "A"])。
  • 抱歉,我以为你在说detailTraitscount排序
  • 我忽略了一个重要细节,排序不会有帮助,因为项目不一定在数组的开头(例如,selectedDetails["B"]detailTraits["A", "B"],这实际上是匹配)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-13
  • 2016-12-29
  • 2010-09-17
  • 2023-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多