我发现了这篇文章:What's the Best Way to Shuffle an NSMutableArray?
当我尝试在我自己的代码中部署它时,我无法让它工作......
有人可以帮我解决这个问题吗?
对我来说,看起来没有调用shuffle函数..?
这是我的代码:
// // shuffle2ViewController.h // shuffle2
#import
@interface shuffle2ViewController : UIViewController {
NSMutableArray *puzzles;
int *randomSort;
}
- (void)shuffle;
@end
//=============================
// shuffle2ViewController.m
´#import "shuffle2ViewController.h"
@implementation shuffle2ViewController
(void)viewDidLoad {
[super viewDidLoad];
NSMutableArray *puzzles = [NSMutableArray arrayWithObjects:@"1",@"2",@"3", @"4",@"5",@"6",@"7",@"8",@"9", @"10",@"11",@"12", nil];
// Call the shuffle function
[self shuffle];
// print to log
int i;
NSLog(@"NEW OLD");
NSLog(@"=================");
for (i = 0; i < 12; ++i) NSLog(@" %2i %@", i + 1, [puzzles objectAtIndex:i]); }
int randomSort(id obj1, id obj2, void *context ) {
// returns random number -1 0 1
return (random()%3 - 1); }
(void)shuffle { // call custom sort function
[puzzles sortUsingFunction:randomSort context:nil];
}
给出这个结果:
NEW OLD
=================
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
答案 0 :(得分:4)
您的问题是您正在重新声明puzzles
数组。这是课堂上的一个ivar,但是因为你的NSMutableArray * puzzles = ...
方法中有viewDidLoad
,所以它会覆盖实例变量。如果您在随机播放方法中NSLog(@"%@", puzzles);
,则会看到它记录(null)
。
简单的解决方法是删除NSMutableArray *
方法中的viewDidLoad
。
修改强>
另外(正如Peter在评论中提到的那样)不要忘记retain
数组。
答案 1 :(得分:0)
以下是我使用的内容:
- (void) shuffle
{
// Use the Fisher-Yates shuffle method (http://en.wikipedia.org/wiki/Fisher-Yates_shuffle):
/*
Random rng = new Random(); // i.e., java.util.Random.
int n = array.length; // The number of items left to shuffle (loop invariant).
while (n > 1)
{
int k = rng.nextInt(n); // 0 <= k < n.
n--; // n is now the last pertinent index;
int temp = array[n]; // swap array[n] with array[k] (does nothing if k == n).
array[n] = array[k];
array[k] = temp;
}
*/
NSUInteger n = [_cards count];
while(1 < n) {
NSUInteger k = random() % n;
n--;
[_cards exchangeObjectAtIndex:n withObjectAtIndex:k];
}
}