Get n random objects (for example 4) from nsarray

后端 未结 3 677
礼貌的吻别
礼貌的吻别 2020-12-29 11:31

I have a large NSArray of names, I need to get random 4 records (names) from that array, how can I do that?

相关标签:
3条回答
  • 2020-12-29 11:47

    I made a caregory called NSArray+RandomSelection. Just import this category into a project, and then just use

    NSArray *things = ...
    ...
    NSArray *randomThings = [things randomSelectionWithCount:4];
    

    Here's the implementation:

    NSArray+RandomSelection.h

    @interface NSArray (RandomSelection)
        - (NSArray *)randomSelectionWithCount:(NSUInteger)count;
    @end
    

    NSArray+RandomSelection.m

    @implementation NSArray (RandomSelection)
    
    - (NSArray *)randomSelectionWithCount:(NSUInteger)count {
        if ([self count] < count) {
            return nil;
        } else if ([self count] == count) {
            return self;
        }
    
        NSMutableSet* selection = [[NSMutableSet alloc] init];
    
        while ([selection count] < count) {
            id randomObject = [self objectAtIndex: arc4random() % [self count]];
            [selection addObject:randomObject];
        }
    
        return [selection allObjects];
    }
    
    @end
    
    0 讨论(0)
  • 2020-12-29 11:57
    #include <stdlib.h>
    
    NSArray* names = ...;
    NSMutableArray* pickedNames = [NSMutableArray new];
    
    int remaining = 4;
    
    if (names.count >= remaining) {
        while (remaining > 0) {
           id name = names[arc4random_uniform(names.count)];
    
           if (![pickedNames containsObject:name]) {
               [pickedNames addObject:name];
               remaining--;
           }
        }
    }
    
    0 讨论(0)
  • 2020-12-29 11:58

    If you prefer a Swift Framework that also has some more handy features feel free to checkout HandySwift. You can add it to your project via Carthage then use it like this:

    import HandySwift    
    
    let names = ["Harry", "Hermione", "Ron", "Albus", "Severus"]
    names.sample() // => "Hermione"
    

    There is also an option to get multiple random elements at once:

    names.sample(size: 3) // => ["Ron", "Albus", "Harry"]
    

    I hope this helps!

    0 讨论(0)
提交回复
热议问题