Как отсортировать NSMutableArray игральных карт, используя мудрый номер - PullRequest
0 голосов
/ 06 апреля 2011

У меня есть NSMutableArrary, у него есть изображение игральных карт вроде:

01-13 карты - пики,
14-26 червы,
27-39 бриллиантов, а
40-52 Клубы.

Я сортирую по цвету, используя этот код,

[CopyArraryForShorting sortUsingSelector:@selector(caseInsensitiveCompare:)];

но я не могу отсортировать его по номеру. Подскажите пожалуйста как это отсортировать.

arrayPlayerCard=[NSArray arrayWithObjects:[UIImage imageNamed:@"01.png"],
                                          [UIImage imageNamed:@"02.png"],
                        [UIImage imageNamed:@"03.png"],
                                          [UIImage imageNamed:@"04.png"],
                                          [UIImage imageNamed:@"05.png"],
                  [UIImage imageNamed:@"06.png"],
                                          [UIImage imageNamed:@"07.png"],
                                          [UIImage imageNamed:@"08.png"],........,nil];

1 Ответ

1 голос
/ 06 апреля 2011

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

Если возможно, я бы посоветовал вам смоделировать класс карты, в котором есть переменные-члены для значения и масти. Когда вы моделируете свои данные надлежащим образом, очевидные варианты использования, как правило, легко решаются. Тот факт, что в данном случае это борьба, является хорошим признаком того, что модель данных (строки с числовыми значениями, которые не обязательно означают что-либо вне этого кода) является плохой.

Тем не менее, вы можете застрять в имеющейся у вас модели данных, и в этом случае вы можете добиться сортировки без учета костюма, выполнив следующие действия:

  1. принимает целочисленные значения чисел в начале каждого имени файла
  2. вычтите одно из этих значений, чтобы превратить его в систему нумерации с нуля
  3. используйте модуль 13, чтобы получить значение карты (фактически значение карты минус один, но это хорошо для сортировки)
  4. используйте значение карты для сравнения

sortUsingFunction ваш друг здесь. Вот простая реализация:

#import <Foundation/Foundation.h>

NSInteger compareCardsByValue(id a, id b, void *context) {
    // Get the integer value of the number at the start
    // of the filename
    NSInteger a_int = [(NSString*)a integerValue];
    NSInteger b_int = [(NSString*)b integerValue];

    // For each of the integer values, subtract one (so
    // we have a zero-based numbering system), then get
    // the value of the integer modulo 13
    a_int = (a_int - 1) % 13;
    b_int = (b_int - 1) % 13;

    // if you want aces to be high:
    //if (a_int == 0) a_int = 13;        
    //if (b_int == 0) b_int = 13;        

    // Now compare and return the appropriate value
    if (a_int < b_int) return NSOrderedAscending;
    if (a_int > b_int) return NSOrderedDescending;
    return NSOrderedSame;
}

int main (int argc, char const *argv[])
{
    NSAutoreleasePool *arp = [[NSAutoreleasePool alloc] init];

    // Create a mutable array
    NSMutableArray *a = [NSMutableArray arrayWithCapacity:52];

    // Generate 52 image names, 01.png to 52.png, and add
    // them to the array
    for (NSInteger i = 1; i <= 52; i++) {
        NSString *imageName = [NSString stringWithFormat:@"%02i.png", i];
        [a addObject:imageName];
    }

    // Sort using the compareCardsByValue function
    [a sortUsingFunction:compareCardsByValue context:NULL];

    // Print out the resulting array
    for (NSString *s in a) {
        NSLog(@"%@", s);
    }

    [arp drain];
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...