NSMutableArray计算对象的出现次数,然后重新排列数组

Wim*_*den 5 sorting objective-c nsmutablearray ios

我一直在寻找修改NSMutableArray的最佳方法,它可以保存同一个对象的多个实例.我也在4.0以下的iOS版本工作,所以使用块不是要走的路.

情况如下:

我有这样一个数组:

ARRAY = [object1,object2,object3,object4,object5,object6,object7,object8];
Run Code Online (Sandbox Code Playgroud)

假设object2 object3和object4实际上是相同的对象.而对象1和对象7也是如此.然后我想重新排列数组,以便最多出现的情况首先出现,依此类推.所以数组必须如下所示:

[Object2的,object3,object4,object1,object7,object5,object6,object8];

小智 6

有几种方法可以做到这一点,其中一种方法是使用辅助NSCountedSet实例和使用它NSCountedSet进行比较的函数:

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;
}
Run Code Online (Sandbox Code Playgroud)

NSMutableArray *array = …;

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

[array sortUsingFunction:countedSort context:countedSet];
Run Code Online (Sandbox Code Playgroud)

编辑: extremeboredom巧妙地注意到,如果两个不同的对象具有相同的重复计数,那么它们的对应元素在结果数组中不一定是连续的.只有在相同对象不必连续的情况下才应使用此解决方案.


进一步编辑:如果您需要表示同一对象的元素是连续的,您可以创建一个仅包含不同元素的较小数组,并按重复次数排序.然后,创建另一个数组,其中元素按重复计数排序.根据您的需要,您可能实际上不需要生成的数组 - 可能只有distinctArray&计数的设置就足够了.

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

// Array with distinct elements only, sorted by their repeat count
NSArray *distinctArray = [[countedSet allObjects]
    sortedArrayUsingFunction:countedSort context:countedSet];

// Array with all the elements, where elements representing the same
// object are contiguous
NSMutableArray *sortedArray = [NSMutableArray arrayWithCapacity:[array count]];
for (id object in distinctArray) {
    for (NSUInteger i = 0; i < [countedSet countForObject:object]; i++) {
        [sortedArray addObject:object];
    }
}
Run Code Online (Sandbox Code Playgroud)


Pra*_*abh 0

您可以使用 isKindOfClass 和 isMemberOfClass 实例方法来管理它。因此,只需循环遍历您的数组并根据您的要求继续将项目推送到新数组中