【问题标题】:Trying to access some elements in an IndexSet试图访问 IndexSet 中的某些元素
【发布时间】:2017-12-31 05:14:56
【问题描述】:

我正在使用IndexSet,并且我正在尝试访问一些有时是连续的而有时不是连续的索引。

例如,我的集合可能包含[1, 2, 3, 5, 6, 7, 13, 31]

我想从集合中拉出3...13 的范围,但语法有困难。我通过myIndexSet.sorted() 学习了如何使用 Apple 文档中的函数命令。但是,Apple 文档没有给出如何访问集合中一系列元素的示例。用于访问索引集中元素的 Apple 文档如下:

subscript(Range<IndexSet.Index>)

我尝试了多种方法来编写此内容,但无法弄清楚如何正确执行。有人可以告诉我如何访问集合中的一系列元素来创建一个新集合吗?我尝试过诸如:

let subset = subscript(Range: myLargerSet.3...13)

但它似乎不起作用。

谢谢

【问题讨论】:

  • let slice = indexSet[indexSet.indexRange(in: 3...13)]?

标签: swift nsindexset


【解决方案1】:

您正在寻找的是您的IndexSet ([1, 2, 3, 5, 6, 7, 13, 31]) 与另一个IndexSet ([3, 4, ..., 12, 13]) 的intersection

let yourIndexSet: IndexSet = [1, 2, 3, 5, 6, 7, 13, 31]
let desiredIndexRange = IndexSet(3...13)
let indicesOfInterest = yourIndexSet.intersection(desiredIndexRange)
print(indicesOfInterest.sorted()) // => [3, 5, 6, 7, 13]

【讨论】:

  • 感谢这项工作,以下也给了我一些有益的理解。
【解决方案2】:

一种可能的解决方案是使用过滤器创建一个新的IndexSet

let set = IndexSet(arrayLiteral: 1,2,3,5,6,7,13,31)
let subset = set.filteredIndexSet { (index) -> Bool in
    index >= 3 && index <= 13
}

【讨论】:

  • 这很好,因为它不需要分配新的索引集(如果范围很大,它可能很大),但我不喜欢你写的语法。我建议改为3 &lt;= index &amp;&amp; index &lt;= 13,或者更好:3...13 ~= index
  • 或许:let set: IndexSet = [1,2,3,5,6,7,13,31]; let subset = set.filteredIndexSet{ 3...13 ~= $0 }
  • 如果你真的疯了:set.filteredIndexSet(includeInteger: (3...13).contains)
【解决方案3】:

您可以按如下方式访问原始集合的一部分:

let slice = indexSet[indexSet.indexRange(in: 3...13)]

slice 就地访问现有元素,因此创建切片是 O(1)

【讨论】:

  • accesses the existing elements in place 并不暗示O(1)。还是您在谈论空间复杂性?
  • 您能解释一下indexSet.indexRange(in: 3...13)IndexSet(3...13) 的区别吗?我不太明白其中的区别
  • @Alexander "切片存储视图的基本集合以及开始和结束索引。它不会将集合中的元素复制到单独的存储中。因此,创建切片需要 O(1)复杂。” - developer.apple.com/documentation/swift/bidirectionalslice
  • 这仅适用于可随机寻址、连续存储的元素。如果 IndexSet 被实现为常规 HashSet(从元素到它们自身的 HashMap),那么它们是非连续存储的,这样的操作需要依次查找每个元素。
  • 刚刚查看了NSIndexSet on Linux(支持IndexSet)的实现,它将元素作为[Range&lt;Int&gt;] 存储在内存中。我认为在O(1) 中无法真正进行切片
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-23
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多