Новичок, нуждающийся в помощи в перетасовке массива - PullRequest
0 голосов
/ 12 марта 2010

Я нашел этот пост: Какой самый лучший способ перемешать 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

Ответы [ 2 ]

4 голосов
/ 12 марта 2010

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

Простое исправление заключается в удалении NSMutableArray * в вашем viewDidLoad методе.

EDIT

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

0 голосов
/ 13 марта 2010

Вот что я использую:

- (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];
    }
}
...