如何对NSArray进行随机排序?
问题出现的原因是,当将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的随机排序。
在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不是更慢吗?