删除NSArray中包含重复项的所有字符串

时间:2011-06-16 16:36:21

标签: objective-c

我试图弄清楚如何在Objective-C中实现它。

我想删除NSArray中在数组中出现多次的字符串。

最后我想要一个只有数组中唯一行的数组(这意味着不仅删除了重复项,还删除了与重复项匹配的原始字符串。)

例如,如果您有以下数组:

NSArray *array = [NSArray arrayWithObjects:@"bob", @"frank", @"sarah", @"sarah", @"fred", @"corey", @"corey", nil];

我希望新数组看起来像这样:

@"bob", @"frank", @"fred"

4 个答案:

答案 0 :(得分:24)

使用NSCountedSet

NSCountedSet *countedSet = [NSCountedSet setWithArray:yourArray];
NSMutableArray *finalArray = [NSMutableArray arrayWithCapacity:[yourArray count]];

for(id obj in countedSet) {
   if([countedSet countForObject:obj] == 1) {
      [finalArray addObject:obj];
   }
}

@Caleb建议在名为NSCountedSet的{​​{1}}中添加一个方法,我已在此处实施:

-objectsWithCount:,

完成后,您只需一行

@interface NSCountedSet (JRCountedSetAdditions)

- (NSArray *) objectsWithCount:(NSUInteger) count;

@end

@implementation NSCountedSet (JRCountedSetAdditions) 

- (NSArray *) objectsWithCount:(NSUInteger) count {
   NSMutableArray *array = [NSMutableArray array];
   for(id obj in self) {
      if([self countForObject:obj] == count) {
        [array addObject:obj];
      }  
   }
   return [array copy];
}

@end

顺便说一下,这是类型无关的,所以这适用于任何Objective-C对象。 : - )

答案 1 :(得分:9)

一个班轮:uniqueArray = [[NSSet setWithArray:duplicateArray] allObjects];如果您不关心订购:D

答案 2 :(得分:3)

Jacob's略有不同的方法:

NSArray *array = [NSArray arrayWithObjects:@"bob", @"frank", @"sarah", @"sarah", @"fred", @"corey", @"corey", nil];

NSCountedSet *namesSet = [[NSCountedSet alloc] initWithArray:array];
NSMutableArray *namesArray = [[NSMutableArray alloc] initWithCapacity:[array count]];

[namesSet enumerateObjectsUsingBlock:^(id obj, BOOL *stop){
    if ([namesSet countForObject:obj] == 1) {
        [namesArray addObject:obj];
    }
}];

并且

NSLog(@"old: %@\nNew: %@", array, namesArray);

给出:

2011-06-16 18:10:32.783 SetTest[1756:903] old: (
    bob,
    frank,
    sarah,
    sarah,
    fred,
    corey,
    corey
)
New: (
    frank,
    fred,
    bob
)

街区是你的朋友!由于NSCountedSetNSSet的子类,因此您可以使用那里可用的块方法。

答案 3 :(得分:2)

以下是删除重复字符串的最简单方法:

NSArray *array = [NSArray arrayWithObjects:@"bob", @"frank", @"sarah", @"sarah", @"fred", @"corey", @"corey", nil];
NSArray *distintStrings = [array valueForKeyPath:@"@distinctUnionOfObjects.self"];