3

我将如何采用包含重复项的一长串数字的数组,例如:

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

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

[array count];

有任何想法吗?

4

4 回答 4

6
NSCountedSet *set = [[NSCountedSet alloc] initWithArray:array];

int duplicates = 0;
for (id object in set) {
  if ([set countForObject:object] > 1) {
    duplicates++;
  }
}

这将计算有多少元素有重复。

于 2013-11-08T18:33:06.670 回答
3

旁注,该数组包含一堆字符串,没有数字......

无论如何,如果目标是获得计数,您可以使用以下单行来获得它。

NSUInteger diff = [array count] - [[array valueForKeyPath:@"@distinctUnionOfObjects.self"] count];

这使用 KVC(键值编码)来获取所有不同的对象(即没有重复的对象)对它们进行计数并获得与原始计数的差异。

于 2013-11-08T18:33:15.883 回答
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
于 2013-11-08T18:34:09.967 回答
0

将此用于filteredArrayUsingPredicate条件的谓词并返回包含所需对象的数组。

NSArray* arr=[[NSArray alloc] initWithObjects:@"10",@"11",@"10",@"2", nil];

    NSLog(@"%d",[[arr filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF == '2'"]] count]);
于 2013-11-08T18:31:31.987 回答