2017-11-06 12 views
2

私は配列に配置し、繰り返し配列を持たない配列から要素数を返す拡張を作成したいと思います。どうすればいい?これは私が今までに持っているものですが、完璧ではありません。重複は考慮されておらず、これが実行される最善の方法のようには見えません。私は重複のためにセットを使用することが理にかなっていると思っていました。配列からランダムな数のセットを取得する

extension Array { 
    func randomElement(numberOfItems:Int) -> [Element] { 
     var finalReturn = Array() 
     for i in 0..<numberOfItems { 
      finalReturn.append(self[Int(arc4random_uniform(UInt32(self.count)))]) 
     } 
     return finalReturn 
    } 
} 

このようにする必要があります。ここで

let selected = allData.randomElement(numberOfItems: 10) 
+0

私のソリューションはあなたのために機能しましたか? – nathan

答えて

0

はそれを行うための一つの方法である:

extension Array { 
    func randomElements(number: Int) -> [Element] { 
     guard number > 0 else { return [Element]() } 
     var remaining = self 
     var chosen = [Element]() 
     for _ in 0 ..< number { 
      guard !remaining.isEmpty else { break } 
      let randomIndex = Int(arc4random_uniform(UInt32(remaining.count))) 
      chosen.append(remaining[randomIndex]) 
      remaining.remove(at: randomIndex) 
     } 
     return chosen 
    } 
} 

サンプル:

let testArray = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
let randomThree = testArray.randomElements(number: 3) 
// randomThree is [1, 5, 4] 

あなたのユースケースに応じて、あなたは時に数動作を変更することもできます要求された要素の数が配列内の要素の数よりも多い。

上記のサンプルでは、​​この場合、可能な要素の最大数(元の配列の要素数)を返します。あるいは、エラーを返すか、またはnilを返すことができます。

関連する問題