gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 04:32:15 25 4
gpt4 key购买 nike

我一直在寻找修改 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com