如何从Swift中的集合中获取随机元素?

礼貌的麋鹿

从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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章