2017-11-06 4 views
2

Ich möchte eine Erweiterung schreiben, die es mir erlaubt, in ein Array und eine festgelegte Anzahl von Elementen aus diesem Array ohne wiederholte Elemente zurückgeben. Wie würde ich das tun? Das habe ich bisher, aber es ist nicht perfekt. Es berücksichtigt keine Duplikate und es scheint nicht der beste Weg dafür zu sein. Ich dachte, es könnte Sinn machen, einen Satz für Duplikate zu verwenden.Erhalten Sie eine bestimmte Anzahl von zufälligen Elementen aus Array

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 
    } 
} 

Nutzung sollte so sein.

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

Hat meine Lösung für Sie funktioniert? – nathan

Antwort

0

Hier ist eine Möglichkeit, es zu tun:

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 
    } 
} 

Probe:

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

auf Ihren Anwendungsfall abhängig, das Verhalten ändern möchten, wenn die Anzahl der angeforderten Elemente ist größer als die Anzahl der Elemente im Array.

In meinem Beispiel oben, wenn das der Fall ist, gebe ich die maximale Anzahl der Elemente möglich (die Anzahl der Elemente im ursprünglichen Array). Alternativ könnten Sie einen Fehler geben oder nil zurückgeben.

Verwandte Themen