如何对NSArray进行随机排序?

8 浏览
0 Comments

如何对NSArray进行随机排序?

假设我有一个包含50到100个对象的NSArray。如何将数组随机排序?

0
0 Comments

问题出现的原因是,当将NSArray转换为NSSet,再将NSSet转换回NSArray时,由于NSSet没有索引,所以NSArray对象可能会被打乱顺序。这是一种不太正规的解决方法,但是它能够工作(不确定)。

解决方法是在将NSArray转换为NSSet之前,先将NSArray中的重复对象去除。这样可以确保转换后的NSSet中只包含唯一的元素。下面是一种实现方法:

NSArray *test = [NSArray arrayWithObjects:@"AA",@"BC",@"DE",@"EG",@"FA",@"GQ",@"DA"];

NSMutableSet *uniqueSet = [NSMutableSet set];

for (id obj in test) {

[uniqueSet addObject:obj];

}

NSArray *randomOrder = [uniqueSet allObjects];

NSLog(@"random : %@",randomOrder);

通过上述代码,我们先创建一个空的NSMutableSet,然后遍历原始的NSArray,将元素逐个添加到NSMutableSet中。由于NSSet只包含唯一的元素,所以重复的元素不会被添加进去。最后,我们将NSMutableSet转换为NSArray,并且打印出结果。这样就实现了对NSArray的随机排序。

0
0 Comments

在NSArray中随机排序的方法有很多种,但大多数都涉及到生成随机数。也许你可以使用下面这种方法,使用NSMutableArray:

1. 生成一个0到49的随机数(假设有50个元素)

2. 交换第0个元素和你生成的随机数对应位置的元素

3. 生成一个1到49的随机数

4. 交换第1个元素和你生成的随机数对应位置的元素

依此类推。

这可能是最高效的方法。

样例代码(未经测试):

srandom(time(NULL));
for (NSInteger x = 0; x < [array count]; x++) {
    NSInteger randInt = (random() % ([array count] - x)) + x;
    [array exchangeObjectAtIndex:x withObjectAtIndex:randInt];
}

另外,你可以使用两个NSMutableArray对象,简单地循环遍历第一个数组,随机选择一个元素并将其添加到第二个数组的末尾。但是,原地方法可能更快。

使用arc4random()更好!

这是Fisher-Yates算法的一种版本。参考en.wikipedia.org/wiki/Fisher–Yates_shuffle

arc4random不是更慢吗?

0