如何使用包含重复数据的长列表数组,例如:
NSArray *array = [NSArray arrayWithObjects:@"45", @"60", @"100",@"100", @"100", @"60"nil];
想象一下,这是一个巨大的随机数列表。现在我确定我必须使用像NSSet这样的东西,但我不知道如何执行它。此外,一旦我们确定了重复项,我猜我会将这些数字添加到数组中,然后调用
[array count];
有什么想法吗?
答案 0 :(得分:6)
NSCountedSet *set = [[NSCountedSet alloc] initWithArray:array];
int duplicates = 0;
for (id object in set) {
if ([set countForObject:object] > 1) {
duplicates++;
}
}
这将计算有多少元素有重复。
答案 1 :(得分:3)
旁注,该数组包含一串字符串,没有数字......
无论如何,如果目标是获得计数,你可以使用以下单行来获得它。
NSUInteger diff = [array count] - [[array valueForKeyPath:@"@distinctUnionOfObjects.self"] count];
这使用KVC(键值编码)来获取所有不同的对象(即没有欺骗的对象)对它们进行计数并获得与原始计数的差异。
答案 2 :(得分:3)
NSCountedSet
非常适合您想要做的事情。
NSArray *array = [NSArray arrayWithObjects:@"45", @"60", @"100",@"100", @"100", @"60",nil];
NSCountedSet *countedSet = [NSCountedSet setWithArray:array];
__block NSUInteger totalNumberOfDuplicates = 0;
[countedSet enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
NSUInteger duplicateCountForObject = [countedSet countForObject:obj];
if (duplicateCountForObject > 1)
totalNumberOfDuplicates += duplicateCountForObject;
NSLog(@"%@ appears %ld times", obj, duplicateCountForObject);
}];
NSLog(@"Total number of duplicates is %ld", totalNumberOfDuplicates);
产生
45 appears 1 times
60 appears 2 times
100 appears 3 times
Total number of duplicates is 5
答案 3 :(得分:0)
使用filteredArrayUsingPredicate
这会根据您的条件使用谓词并返回包含所需对象的数组。
NSArray* arr=[[NSArray alloc] initWithObjects:@"10",@"11",@"10",@"2", nil];
NSLog(@"%d",[[arr filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF == '2'"]] count]);