2010-03-12 1 views
0

Я нашел этот пост: What's the Best Way to Shuffle an NSMutableArray?Начинающие, нуждающихся в помощи на shuffeling массив

И как я стараюсь, чтобы развернуть это в моем собственном коде, я не могу заставить его работать ...

Может кто-нибудь помочь мне решить этот код?

Мне кажется, что функция тасования не называется ..?

вот мой код:

// // 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 
+2

Nooooooo !!!! Не используйте '-sort' для реализации перетасовки. Используйте Shuffle Fisher-Yates, который работает в O (n) вместо O (n log n) и, возможно, генерирует более равномерный результат (http://en.wikipedia.org/wiki/Fisher-Yates_shuffle). – kennytm

+0

Лучшая ссылка на Википедию: http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle –

+1

steffen Myklebust: Почему бы не использовать наивысший рейтинг ответа на этот вопрос? http://stackoverflow.com/questions/56648/whats-the-best-way-to-shuffle-an-nsmutablearray/56656#56656 Это не идеально ('int' обычно неправильный тип для использования в какао), но это лучше, чем основывать ваш тасование на неопознанной сортировке. –

ответ

4

Вашей проблема заключается в том, что вы в puzzles повторное объявление массива. Это класс ivar в классе, но поскольку у вас есть NSMutableArray * puzzles = ... в вашем методе viewDidLoad, он переопределяет переменную экземпляра. Если у вас есть NSLog(@"%@", puzzles); в вашем методе тасования, вы увидите, что он регистрирует (null).

Простым решением является удаление NSMutableArray * в вашем методе viewDidLoad.

EDIT

Кроме того (как Петр упоминает в комментариях) не забудьте retain массива.

+2

Простое удаление типа и, тем самым, изменение объявления в оператор, вызовет проблему недодержания, поскольку выражение в правой части = не выделяет или не сохраняет массив. –

+0

@ Петр возглавляет, спасибо, что поймал это. –

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]; 
    } 
} 
Смежные вопросы