NSSet wie man Objekte zufällig extrahiert?

8

Ich bin mir nicht sicher, wie NSSets anyObject funktioniert. Was bedeutet es, dass "Das zurückgegebene Objekt nach Belieben ausgewählt wird" (aus der NSSet Klassenreferenz )?

Wie kann ich Objekte am besten aus einem NSSet extrahieren? Ich dachte daran, allObjects in einem Array zu bekommen und dann myArray[arc4random_uniform(x)] , wobei x die Anzahl der Objekte im Array ist.

    
ticofab 27.06.2012, 20:50
quelle

4 Antworten

13

Gewöhnlich werden NSSet Instanzen mit einem CFHash Backing erstellt, also geben sie fast immer das erste Objekt in diesem Hash zurück, da es am schnellsten ist, nachzuschlagen. Der Grund, warum es sagt

  

Das zurückgegebene Objekt wird nach Belieben ausgewählt - die Auswahl ist nicht garantiert zufällig.

Weil Sie nicht immer wissen, dass es ein Backing-Array haben wird. Nach allem, was Sie wissen, hat die NSSet Instanz, die Sie haben, eine NSDictionary , die es unterstützt, oder eine andere ähnliche Datenstruktur.

Wenn Sie also ein zufälliges Objekt von einem NSSet benötigen, verwenden Sie nicht -anyObject , sondern stattdessen allObjects: und mischen Sie dann das Array.

    
Richard J. Ross III 27.06.2012, 20:56
quelle
14

Zitat aus NSSet-Klassenreferenz :

  

Das zurückgegebene Objekt wird nach Belieben ausgewählt - die Auswahl ist nicht garantiert zufällig.

Konvertieren Sie für "Zufälligkeit" das NSSet in ein NSArray mit [theSet allObjects] .
Wählen Sie als Nächstes ein beliebiges Objekt mit arc4random_uniform() aus.

    
Anne 27.06.2012 20:56
quelle
4

Die Dokumentation liest, dass anyObject zurückgibt

  

Eines der Objekte in der Menge oder null, wenn die Menge keine Objekte enthält.   Das Objekt, das zurückgegeben wird, wird nach dem Komfort des Sets ausgewählt - die Auswahl   ist nicht garantiert, zufällig zu sein.

Höchstwahrscheinlich gibt es einen deterministischen Algorithmus bei der Arbeit.

Am zuverlässigsten wäre es, wie Sie vorschlagen, ein NSArray mit der NSSet Methode allObjects zu erstellen und dann ein zufälliges Element mit arc4random() % N auszuwählen, wobei N das ist count der NSArray .

    
PengOne 27.06.2012 20:56
quelle
1

Ich benutze arc4random () und zwei veränderbare Arrays, um eine zufällige und einzigartige Menge von Objekten zu erhalten:

%Vor%

Ich bin mir nicht sicher, wie effizient es für große Sammlungen sein würde, aber es funktioniert für mich mit Sammlungen, die in den unteren 100ern von Objekten nummerieren.

    
jay492355 15.02.2013 06:04
quelle

Tags und Links