У меня есть большой NSArray имен, мне нужно получить случайные 4 записи (имена) из этого массива, как я могу это сделать?
Получить n случайных объектов (например, 4) из nsarray
Ответ 1
#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--;
}
}
}
Ответ 2
Я сделал пометку NSArray+RandomSelection
. Просто импортируйте эту категорию в проект, а затем просто используйте
NSArray *things = ...
...
NSArray *randomThings = [things randomSelectionWithCount:4];
Здесь реализация:
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
Ответ 3
Если вы предпочитаете Swift Framework, у которой есть еще несколько полезных функций, вы можете бесплатно проверить HandySwift. Вы можете добавить его в свой проект через Carthage, затем использовать его следующим образом:
import HandySwift
let names = ["Harry", "Hermione", "Ron", "Albus", "Severus"]
names.sample() // => "Hermione"
Существует также возможность сразу получить несколько случайных элементов:
names.sample(size: 3) // => ["Ron", "Albus", "Harry"]
Надеюсь, это поможет!