我有一个包含自定义对象的NSArray,例如:
[A, A, B, C, A, D, E, B, D]
最好的方法是将这些项目分组,使最终结果类似于以下内容:
A: 3
B: 2
C: 1
D: 2
E: 1
请注意,这些重复项都是具有相同属性的不同实例,但我已经为此覆盖了
isEqual:
方法。我有一个包含自定义对象的NSArray,例如:
[A, A, B, C, A, D, E, B, D]
最好的方法是将这些项目分组,使最终结果类似于以下内容:
A: 3
B: 2
C: 1
D: 2
E: 1
isEqual:
方法。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]);
}
}
hash
呢?我以为只重写 isEqual
就足够了... - pixelfreak-hash
的唯一必须成立的事情是两个相等的对象(即从-isEqual:
返回YES
的对象)必须从-hash
返回相同的值。然而,反之不一定成立。从-hash
返回相同值的两个对象不一定相等。这意味着你可以将此方法实现为- (NSUInteger)hash { return 1; }
。如果你想的话。但是,这将导致非常低效的字典/集合。哈希函数的维基百科页面有有用的信息。 - Lily BallardNSObject
上-hash
的默认实现只是返回对象指针。这意味着如果你实现了自定义的-isEqual:
(并且希望将对象用作字典的键或集合的一部分),则必须重写它。 - Lily Ballardint
),那么你提供的链接是很好的。 - Lily BallardNSCountedSet
中的任何对象,它将不能按预期工作? - pixelfreakNSCountedSet
类。NSCountedSet *countedSet = [[NSCountedSet alloc] initWithArray:myArray];
NSUInteger countForA = [countedSet countForObject:@"A"];
NSLog(@"A: %u", countForA);