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)
| 归档时间: |
|
| 查看次数: |
3411 次 |
| 最近记录: |