0

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

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

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

subscript(Range<IndexSet.Index>)

我已经尝试了很多方法来写这个,但无法弄清楚如何正确地做到这一点。有人可以告诉我如何访问集合中的一系列元素来创建一个新集合吗?我已经尝试过诸如:

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

但它似乎不起作用。

谢谢

4

3 回答 3

2

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

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]
于 2017-12-31T05:21:48.567 回答
0

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

let set = IndexSet(arrayLiteral: 1,2,3,5,6,7,13,31)
let subset = set.filteredIndexSet { (index) -> Bool in
    index >= 3 && index <= 13
}
于 2017-12-31T05:27:18.897 回答
0

您可以访问原始集合的一部分,如下所示:

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

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

于 2017-12-31T05:33:01.950 回答