1

我知道如何按字母对数组进行排序,但我想根据其中对象的受欢迎程度对我的 NSMutableArray 进行排序。想象一个包含以下对象的数组:

  • 一个
  • C
  • 一个

我想按受欢迎程度对这些对象进行排序并创建一个这样的数组:

  • 一个
  • 一个
  • C

有没有一个好的和快速的方法来做到这一点?也许是 NSSortDescriptor 的键?(找不到那个)

谢谢

4

4 回答 4

1

简而言之,为了简洁起见,我使用了数组文字的新语法。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        NSArray *ar = @[@"B", @"A", @"C", @"B", @"B", @"A"];
        NSCountedSet *countedSet = [NSCountedSet setWithArray:ar];
        NSArray *sorted = [ar sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
            NSInteger diff = [countedSet countForObject:obj1] - [countedSet countForObject:obj2];
            if (diff < 0)
                return NSOrderedDescending;
            else if (diff > 0)
                return NSOrderedAscending;
            else
                return NSOrderedSame;
        }];
        NSLog(@"%@", ar);
        NSLog(@"%@", sorted);
    }
    return 0;
}

输出

2012-05-08 07:25:18.465 Sort[20434:303] (
    B,
    A,
    C,
    B,
    B,
    A
)
2012-05-08 07:25:18.468 Sort[20434:303] (
    B,
    B,
    B,
    A,
    A,
    C
)
于 2012-05-08T14:25:47.380 回答
0
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"theSortKey"
                                              ascending:YES] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray;
sortedArray = [myArray sortedArrayUsingDescriptors:sortDescriptors];

也看到这个线程

如何对包含自定义对象的 NSMutableArray 进行排序?

于 2012-05-08T14:02:44.880 回答
0

这应该适合你。

NSArray *array = [[NSArray alloc] initWithObjects:@"A", @"A", @"B", @"B", @"B", @"C", nil];
NSMutableDictionary *occurenceOfValues = [[NSMutableDictionary alloc] init];
for (id value in array) {
    NSNumber *count = [occurenceOfValues objectForKey:value];
    [occurenceOfValues setValue:[NSNumber numberWithInt:[count intValue] + 1] forKey:value];
}
NSArray *valuesInOrder = [[[occurenceOfValues keysSortedByValueUsingSelector:@selector(compare:)] reverseObjectEnumerator] allObjects];
NSMutableArray *sortedArray = [[NSMutableArray alloc] initWithCapacity:array.count];
for (id value in valuesInOrder) {
    NSNumber *count = [occurenceOfValues objectForKey:value];
    for (int i = 0; i < [count intValue]; i++) {
        [sortedArray addObject:value];
    }
}
NSLog(@"%@", sortedArray);

控制台输出:

2012-05-08 09:20:15.805 SortArrayPopularity[25206:f803](B、B、B、A、A、C)

于 2012-05-08T14:21:23.040 回答
0

我会使用以 A,B,C... 作为键的字典并将默认值设置为 0

然后枚举数组并增加相应键的计数。

最后对 [dict allKeys] 返回的键数组进行排序;

于 2012-05-08T14:24:13.460 回答