Я предполагаю, что вы хотите, чтобы карты сортировались в строгом числовом порядке, независимо от масти. Итак, все тузы, потом все двое и так далее.
Если возможно, я бы посоветовал вам смоделировать класс карты, в котором есть переменные-члены для значения и масти. Когда вы моделируете свои данные надлежащим образом, очевидные варианты использования, как правило, легко решаются. Тот факт, что в данном случае это борьба, является хорошим признаком того, что модель данных (строки с числовыми значениями, которые не обязательно означают что-либо вне этого кода) является плохой.
Тем не менее, вы можете застрять в имеющейся у вас модели данных, и в этом случае вы можете добиться сортировки без учета костюма, выполнив следующие действия:
- принимает целочисленные значения чисел в начале каждого имени файла
- вычтите одно из этих значений, чтобы превратить его в систему нумерации с нуля
- используйте модуль 13, чтобы получить значение карты (фактически значение карты минус один, но это хорошо для сортировки)
- используйте значение карты для сравнения
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;
}