How Do I sort an NSMutable Array with NSNumbers in it?

后端 未结 7 1967
星月不相逢
星月不相逢 2020-12-05 02:06

I\'m trying to make a high score table, and suck at arrays in objective c (actually, in general objective c is challenging for me), so I can\'t figure out how to sort. I\'m

相关标签:
7条回答
  • 2020-12-05 02:06

    I tried the answer provided by ohhorob, but the objects were still being sorted alphabetically. Then I ran across this in another answer (https://stackoverflow.com/a/4550451/823356):

    I changed my NSSortDescriptor and it now sorts numerically.

    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"score"
                                                   ascending:YES
                                                  comparator:^(id obj1, id obj2) {
        return [obj1 compare:obj2 options:NSNumericSearch];
    }];
    

    I just thought I'd drop this in here as it solved my 'alphabetical sorting of NSNumbers' problem

    0 讨论(0)
  • 2020-12-05 02:08

    distance is a key and it's value link (float or double)

    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"distance"
    ascending:YES
    comparator:^(id obj1, id obj2)
                         {
                      return [obj1 compare:obj2 options:NSNumericSearch];
                         }];
    NSArray *myArray = [NSArray arrayWithArray:arraySubCat];
    myArray=[myArray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortDescriptor,nil]];
    arraySubCat = [myArray copy];
    
    0 讨论(0)
  • 2020-12-05 02:14

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

    Should work if they're definitely all NSNumbers.

    (Adding an object is:

    [highscores addObject:score];

    )

    If you want to sort descending (highest-first):

    10.6/iOS 4:

    [highscores sortUsingComparator:^(id obj1, id obj2) {
        if (obj1 > obj2)
            return NSOrderedAscending;
        else if (obj1 < obj2)
            return NSOrderedDescending;
    
        return NSOrderedSame;
    }];
    

    Otherwise you can define a category method, e.g.:

    @interface NSNumber (CustomSorting)
    
    - (NSComparisonResult)reverseCompare:(NSNumber *)otherNumber;
    
    @end
    
    @implementation NSMutableArray (CustomSorting)
    
    - (NSComparisonResult)reverseCompare:(NSNumber *)otherNumber {
        return [otherNumber compare:self];
    }
    
    @end
    

    And call it:

    [highscores sortUsingSelector:@selector(reverseCompare:)];

    0 讨论(0)
  • 2020-12-05 02:14

    This code will sort an NSMutableArray of NSNumber in ascending order:

    [tempRA sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        return [obj1 compare:obj2];
    }];
    

    This code will sort an NSMutableArray of NSNumber in descending order:

    [tempRA sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        return [obj1 compare:obj2] * -1; // reverse the enum
    }];
    

    The code uses the fact that the NSNumber compare: method returns an NSComparisonResult that ranges from -1 to 1. Multiplying the result of the compare by -1 reverses the result and thereby reverses the sort to descending order.

    0 讨论(0)
  • 2020-12-05 02:18

    For Descending Order:

    NSArray *DescendingArray = [MinMaxArray sortedArrayUsingDescriptors:
                                    @[[NSSortDescriptor sortDescriptorWithKey:@"doubleValue"
                                                                    ascending:NO]]];
    

    For ascending Order

    NSArray *AscendingArray = [MinMaxArray sortedArrayUsingDescriptors:
                                    @[[NSSortDescriptor sortDescriptorWithKey:@"doubleValue"
                                                                    ascending:YES]]];
    
    0 讨论(0)
  • 2020-12-05 02:32

    Would you like to do that the short way?

    If you have a mutable array of NSNumber instances:

    NSSortDescriptor *highestToLowest = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:NO];
    [mutableArrayOfNumbers sortUsingDescriptors:[NSArray arrayWithObject:highestToLowest]];
    

    Nice and easy :)

    You can also perform similar sorting with descriptors on immutable arrays, but you will end up with a copy, instead of in-place sorting.

    0 讨论(0)
提交回复
热议问题