在数组中查找重复的数字,然后计算重复的数量

时间:2013-11-08 18:22:44

标签: ios nsarray

如何使用包含重复数据的长列表数组,例如:

NSArray *array = [NSArray arrayWithObjects:@"45", @"60", @"100",@"100", @"100", @"60"nil];

想象一下,这是一个巨大的随机数列表。现在我确定我必须使用像NSSet这样的东西,但我不知道如何执行它。此外,一旦我们确定了重复项,我猜我会将这些数字添加到数组中,然后调用

[array count];

有什么想法吗?

4 个答案:

答案 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]);