Как отсортировать NSMutableArray? Необходимо пересмотреть код - PullRequest
2 голосов
/ 19 ноября 2011

Добрый вечер.

Этот код работает. Он сортирует массив карт как по масти, так и по стоимости карт. Это также очень грубая сила. Можете ли вы порекомендовать лучший способ? Помогает ли Objective-C справиться с ситуацией, когда сортируемый объект сам имеет несколько полей, от которых зависит сортировка?

-(void) sort: (NSMutableArray *) deck {        
    NSUInteger count = [deck count];

    Card *thisCard;
    Card *nextCard;

    int this;
    int next;

    BOOL stillSwapping = true;

    while (stillSwapping) {

        stillSwapping = false;

        for (NSUInteger i = 0; i < count; ++i) {
            this = i;
            next = i+1;

            if (next < count) {

                thisCard = [deck objectAtIndex:this];
                nextCard = [deck objectAtIndex:next];

                if ([thisCard suit] > [nextCard suit]) {                        
                    [deck exchangeObjectAtIndex:this withObjectAtIndex:next];
                    stillSwapping = true;
                } 


                if ([thisCard suit] == [nextCard suit]) {
                    if ([thisCard value] > [nextCard value]) {
                        [deck exchangeObjectAtIndex:this withObjectAtIndex:next];
                        stillSwapping = true;
                    } 
                }
            }
        }
    }
}

1 Ответ

7 голосов
/ 19 ноября 2011

У вас есть несколько вариантов.

Возможно, самый простой способ - определить метод -compare: для Card, который возвращает NSComparisonResult.Это предпочтительно, если сортировка по масти и значению является «стандартным» способом сортировки Card.Если вы сделали это, то весь ваш метод сортировки может быть преобразован в

[deck sortUsingSelector:@selector(compare:)];

Если вы не хотите этого делать, вы можете использовать массив NSSortDescriptors, один для иска и один для значения.

[deck sortUsingDescriptors:[NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"suit" ascending:YES], [NSSortDescriptor sortDescriptorWithKey:@"value"] ascending:YES], nil]];

Если по какой-либо причине это не сработает, вы можете попробовать -sortUsingComparator:

[deck sortUsingComparator:^NSComparisonResult(Card *obj1, Card *obj2) {
    int suit1 = [obj1 suit];
    int suit2 = [obj2 suit];
    if (suit1 > suit2) {
        return NSOrderedDescending;
    } else if (suit1 < suit2) {
        return NSOrderedAscending;
    } else {
        id value1 = [obj1 value];
        id value2 = [obj2 value];
        if (value1 > value2) {
            return NSOrderedDescending;
        } else if (value1 < value2) {
            return NSOrderedAscending;
        } else {
            return NSOrderedSame;
        }
    }
}
...