如何排序NSMutableArray?需要进行代码审查

Jam*_*sev 2 sorting objective-c nsmutablearray

晚上好.

这段代码有效.它通过Suit和Card Value对一系列卡片进行排序.这也是非常蛮力.你能推荐一个更好的方法吗?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;
                    } 
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Lil*_*ard 7

你有几个选择.

也许最简单的是定义方法-compare:on Card,返回一个NSComparisonResult.如果按诉讼和价值排序是排序a的"标准"方式,这是首选Card.如果你已经这样做了,那么你的整个排序方法就可以了

[deck sortUsingSelector:@selector(compare:)];
Run Code Online (Sandbox Code Playgroud)

如果你不想这样做,你可以使用一个NSSortDescriptors 数组,一个用于套装,一个用于值.

[deck sortUsingDescriptors:[NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"suit" ascending:YES], [NSSortDescriptor sortDescriptorWithKey:@"value"] ascending:YES], nil]];
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因这不起作用,你可以试试 -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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案.我建议你在你的类上实现`compare:`的建议(使用块中的代码进行比较). (2认同)