我试图弄清楚如何在Objective-C中实现它。
我想删除NSArray
中在数组中出现多次的字符串。
最后我想要一个只有数组中唯一行的数组(这意味着不仅删除了重复项,还删除了与重复项匹配的原始字符串。)
例如,如果您有以下数组:
NSArray *array = [NSArray arrayWithObjects:@"bob", @"frank", @"sarah", @"sarah", @"fred", @"corey", @"corey", nil];
我希望新数组看起来像这样:
@"bob", @"frank", @"fred"
答案 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
)
街区是你的朋友!由于NSCountedSet
是NSSet
的子类,因此您可以使用那里可用的块方法。
答案 3 :(得分:2)
以下是删除重复字符串的最简单方法:
NSArray *array = [NSArray arrayWithObjects:@"bob", @"frank", @"sarah", @"sarah", @"fred", @"corey", @"corey", nil];
NSArray *distintStrings = [array valueForKeyPath:@"@distinctUnionOfObjects.self"];