1

我见过这个问题:
NSMutableArray 计数对象的出现然后重新排列数组

该解决方案非常接近我的需要。

我指的解决方案:

NSInteger countedSort(id obj1, id obj2, void *context) {
   NSCountedSet *countedSet = context;
   NSUInteger obj1Count = [countedSet countForObject:obj1];
   NSUInteger obj2Count = [countedSet countForObject:obj2];

   if (obj1Count > obj2Count) return NSOrderedAscending;
   else if (obj1Count < obj2Count) return NSOrderedDescending;
   return NSOrderedSame;
}    

和:

NSMutableArray *array = …;

NSCountedSet *countedSet = [[[NSCountedSet alloc] initWithArray:array]
autorelease];

[array sortUsingFunction:countedSort context:countedSet];    

排序按计数返回正确的排序数组,但我需要包含或在另一个数组中按升序排序的计数。

4

2 回答 2

1

一种解决方案可能是简单地查询计数集以获取任何对象的计数,以构建一个跟踪计数的数组:

// This after having sorted the array:
NSMutableArray* counts= [NSMutableArray arrayWithCapacity: array.count];
for(id object in array) {
    [counts addObject: @([countedSet countForObject: object]) ];
}
于 2013-09-03T22:13:42.277 回答
0

这将返回一个按出现次数最多的值排序的排序数组

NSCountedSet *countedSet = [[NSCountedSet alloc] initWithArray:array];

NSArray *sortedValues = [countedSet.allObjects sortedArrayUsingComparator:^(id obj1, id obj2) {
    NSUInteger n = [countedSet countForObject:obj1];
    NSUInteger m = [countedSet countForObject:obj2];
    return (n <= m)? (n < m)? NSOrderedDescending : NSOrderedSame : NSOrderedAscending;
}];
于 2015-02-25T15:00:08.900 回答