在NSArray中对重复项进行分组

时间:2011-12-05 20:20:07

标签: iphone objective-c ios ipad

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

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

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

A: 3
B: 2
C: 1
D: 2
E: 1

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

2 个答案:

答案 0 :(得分: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]);
    }
}

答案 1 :(得分:7)

使用NSCountedSet类。

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