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

标签 objective-c ios sorting nsmutablearray

我一直在寻找修改 NSMutableArray 的最佳方法,它可以容纳同一对象的多个实例。我也在为 4.0 以下的 iOS 版本工作,所以使用 block 不是可行的方法。

情况是这样的:

我有一个这样的数组:

ARRAY = [object1,object2,object3,object4,object5,object6,object7,object8];

假设 object2 object3 和 object4 实际上是相同的对象。还有对象 1 和对象 7。然后我想重新排列数组,以便最先出现,依此类推。所以数组必须看起来像这样:

[对象 2、对象 3、对象 4、对象 1、对象 7、对象 5、对象 6、对象 8];

最佳答案

有几种方法可以做到这一点,其中一种是使用辅助 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;
}

NSMutableArray *array = …;

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

[array sortUsingFunction:countedSort context:countedSet];

编辑: 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];
    }
}

关于objective-c - NSMutableArray 计算对象的出现次数,然后重新排列数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6276830/

相关文章:

ios - Table View Controller 每行连接到不同的 View Controller

ios - AutoLayout 和嵌入式 stackview 约束冲突

ios - 在表格 View 中显示多个单元格时出现问题

mysql - php 排序比 mysql "order by"更好吗?

java - 如何使用 If 语句对数字进行排序 (Java)

javascript - 根据 D3 中的属性值对对象进行排序

iphone - 如何使用 Objective C 处理多任务关闭应用程序?

iphone - 尝试根据单元格 subview 的文本量计算 UILabel 的帧大小

ios - 如何在 UIStepper 中腾出空间

objective-c - iOS从子类调用父类方法