从Swift 1.2开始,Apple引入了Set
集合类型。
说,我有一个像这样的集合:
var set = Set<Int>(arrayLiteral: 1, 2, 3, 4, 5)
现在,我想从中获取随机元素。问题是如何?Set
没有提供subscript(Int)
类似的Array
功能。相反,它具有subscript(SetIndex<T>)
。但是首先,SetIndex<T>
它没有可访问的初始值设定项(因此,我不能仅使用所需的偏移量创建索引),其次,即使我可以获取集合(var startIndex = set.startIndex
)中第一个元素的索引,也只有这种方式通过连续调用到第N个索引successor()
。
因此,目前我只能看到两种选择,既丑陋又昂贵:
var array = [Int](set)
),并使用其下标(完全接受Int
);要么successor()
方法链以获得第N个索引,然后通过集合的下标读取对应的元素。我会错过其他方式吗?
也许最好的办法是advance
根据指导successor
为您提供:
func randomElementIndex<T>(s: Set<T>) -> T {
let n = Int(arc4random_uniform(UInt32(s.count)))
let i = advance(s.startIndex, n)
return s[i]
}
(编辑:嘿;注意到您在我将其添加到答案中之前实际上已更新了该问题,以包括此答案...嗯,还是个好主意,我也学到了一些东西。:D)
您也可以遍历集合而不是索引(这是我的第一个想法,但后来我想起了advance
)。
func randomElement<T>(s: Set<T>) -> T {
let n = Int(arc4random_uniform(UInt32(s.count)))
for (i, e) in enumerate(s) {
if i == n { return e }
}
fatalError("The above loop must succeed")
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句