在NSArray中对重复项进行分组

pix*_*eak 5 iphone objective-c ipad ios

我有一个包含自定义对象的NSArray,例如:

[A, A, B, C, A, D, E, B, D]

分组这些项目的最佳方法是什么,最终结果类似于此?

A: 3
B: 2
C: 1
D: 2
E: 1
Run Code Online (Sandbox Code Playgroud)

请注意,重复项是具有相同属性的所有不同实例,但我已isEqual:为此重写.

Lil*_*ard 8

最简单的方法可能是使用NSCountedSet.您可以使用[NSCountedSet setWithArray:myArray]生成数组的计数集,然后可以迭代集的内容以查找集中每个对象的计数.请注意,它不会被排序.

另请注意,您需要提供一个合理的实现方式-hash,因为您只是说你覆盖了-isEqual:.-compare:如果需要排序的结果列表,还需要覆盖.

这是一个快速方法,它接受您的数组并打印每个元素的计数,排序:

void printCountOfElementsInArray(NSArray *ary) {
    NSCountedSet *set = [NSCountedSet setWithArray:ary];
    NSArray *objs = [[set allObjects] sortedArrayUsingSelector:@selector(compare:)];
    for (id obj in objs) {
        NSLog(@"%@: %d", obj, [set countForObject:obj]);
    }
}
Run Code Online (Sandbox Code Playgroud)


Ole*_*ann 7

使用该NSCountedSet课程.

NSCountedSet *countedSet = [[NSCountedSet alloc] initWithArray:myArray];
NSUInteger countForA = [countedSet countForObject:@"A"];
NSLog(@"A: %u", countForA);
Run Code Online (Sandbox Code Playgroud)