iPhone - NSArray - 选择4种不同的商品

时间:2011-09-17 17:58:09

标签: iphone objective-c cocoa-touch

我有超过100个字符串的NSArray 我想随机选择4个不同的字符串。我可以使用for / while循环编写传统的代码方式并完成任务。

但是有没有更好的方法来挑选4个不同的随机字符串?

4 个答案:

答案 0 :(得分:4)

JEFF LAMARCHE's blog中所述洗牌数组并使用前四项

答案 1 :(得分:2)

从NSArray创建一个NSSet并获取前4个元素。

答案 2 :(得分:0)

论坛已经多次回答过这个问题。您生成随机数的关键是

(arc4random() % 100) +1

以上代码能够生成1到100之间的随机数。您可以使用它来获得您想要的。如果您收到了已有的随机数,请忽略并再次拨打以获取唯一的随机数。

答案 3 :(得分:0)

我写了一些utils as category on NSArray

您可以像这样使用它:

#import "NSArray+RandomUtils.h"

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

这将为您提供一组4个独特的随机元素。

如果您想让对象多次出现在您的收藏中,您可以这样做:

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