iPhone - NSArray - Выберите 4 разных предмета - PullRequest
0 голосов
/ 17 сентября 2011

У меня есть NSArray с более чем 100 строками.
Я хотел бы выбрать 4 разных строки случайным образом. Я могу написать традиционный код, используя циклы for / while, и выполнить задачу.

Но есть ли лучший способ выбрать 4 разные случайные строки?

Ответы [ 4 ]

4 голосов
/ 17 сентября 2011

Перемешайте массив, как описано в блоге JEFF LAMARCHE и используйте первые четыре элемента)

2 голосов
/ 17 сентября 2011

создайте NSSet из вашего NSArray и получите первые 4 элемента.

0 голосов
/ 06 октября 2011

Я написал несколько утилит в качестве категории на NSArray .

Вы можете использовать это так:

#import "NSArray+RandomUtils.h"

NSArray *array = [NSArray arrayWithObjects:@"aa", @"ab",@"c",@"ad",@"dd", nil];
NSSet *set = [array setWithRandomElementsSize:4];

Это даст вам набор из 4 уникальных случайныхelements.

Если вы хотите, чтобы объекты были в вашей коллекции более одного раза, вы можете сделать:

NSArray *array = [NSArray arrayWithObjects:@"aa", @"ab",@"c",@"ad",@"dd", nil];
NSArray *resultArray = [array arrayWithRandomElementsSize:4];

#import "NSArray+RandomUtils.h"

@implementation NSArray (RandomUtils)

-(NSMutableArray *)mutableArrayShuffled
{
    NSMutableArray *array = [[self mutableCopy] autorelease];
    [array shuffle];
    return array;
}

-(NSMutableArray *)arrayShuffled
{
    return [NSArray arrayWithArray:[self mutableArrayShuffled]];
}

-(id)randomElement
{
    if ([self count] < 1) return nil;
    NSUInteger randomIndex = arc4random() % [self count];
    return [self objectAtIndex:randomIndex];
}

-(NSSet *)setWithRandomElementsSize:(NSUInteger)size
{
    if ([self count]<1) return nil;
    if (size > [self count]) 
        [NSException raise:@"NSArrayNotEnoughElements" 
                    format:@"NSArray's size (%d) is too small to fill a random set with size %d", [self count], size];

    NSMutableSet *set = [NSMutableSet set];
    NSMutableArray *array = [self mutableArrayShuffled];

    if (size == [array count]) 
        return [NSSet setWithArray:array];

    while ([set count]< size) {
        id object = [array objectAtIndex:0];
        [array removeObjectAtIndex:0];
        [set addObject:object];

    }
    return [NSSet setWithSet:set];
}

-(NSArray *)arrayWithRandomElementsSize:(NSUInteger)size
{
    if ([self count]<1) return nil;

    NSMutableArray *array = [NSMutableArray array];
    while ([array count] < size) {
        [array addObject:[self randomElement]];
    }
    return  [NSArray arrayWithArray:array];
}
@end

@implementation NSMutableArray (RandomUtils)
-(void)shuffle
{

    NSUInteger count = [self count];
    for (NSUInteger i = 0; i < count; ++i) {
        NSUInteger nElements = count - i;
        NSUInteger n = (arc4random() % nElements) + i;
        [self exchangeObjectAtIndex:i withObjectAtIndex:n];
    }
}

@end
0 голосов
/ 17 сентября 2011

На этот вопрос ответили несколько раз на форуме. Ваш ключ для генерации случайных чисел -

(arc4random() % 100) +1

Выше код способен генерировать случайное число в диапазоне от 1 до 100. Вы можете использовать это, чтобы получить то, что вы хотите. Если вы получили случайное число, которое вы уже получили, проигнорируйте и позвоните снова, чтобы получить уникальное случайное число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...