Nic*_*ard 11 objective-c nsarray ios
我有一个包含一些自定义对象的NSMutableArray.其中两个对象具有相同的属性,如标题和作者.我想删除重复的对象,然后离开另一个.
Asset *asset;
NSMutableArray *items = [[[NSMutableArray alloc] init] autorelease];
// First
asset = [[Asset alloc] init];
asset.title = @"Developer";
asset.author = @"John Smith";
[items addObject:asset];
[asset release];
// Second
asset = [[Asset alloc] init];
asset.title = @"Writer";
asset.author = @"Steve Johnson";
[items addObject:asset];
[asset release];
// Third
asset = [[Asset alloc] init];
asset.title = @"Developer";
asset.author = @"John Smith";
[items addObject:asset];
[asset release];
Run Code Online (Sandbox Code Playgroud)
由于它们不是同一个对象,但只有重复属性,我该如何删除副本?
bry*_*mac 13
您可以创建一个HashSet,并在循环时,可以将"title + author"连接集添加到HashSet(NSMutableSet).当您到达每个项目时,如果HashSet包含您的密钥,请将其删除或不复制(删除或创建没有重复项的副本).
这使它成为n阶(1循环)
这是NSMutableSet类:
编辑代码:
代码的核心是一个循环.
void print(NSMutableArray *assets)
{
for (Asset *asset in assets)
{
NSLog(@"%@/%@", [asset title], [asset author]);
}
}
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
//
// Create the initial data set
//
Asset *asset;
NSMutableArray *items = [[[NSMutableArray alloc] init] autorelease];
// First
asset = [[Asset alloc] init];
asset.title = @"Developer";
asset.author = @"John Smith";
[items addObject:asset];
[asset release];
// Second
asset = [[Asset alloc] init];
asset.title = @"Writer";
asset.author = @"Steve Johnson";
[items addObject:asset];
[asset release];
// Third
asset = [[Asset alloc] init];
asset.title = @"Developer";
asset.author = @"John Smith";
[items addObject:asset];
[asset release];
NSLog(@"****Original****");
print(items);
//
// filter the data set in one pass
//
NSMutableSet *lookup = [[NSMutableSet alloc] init];
for (int index = 0; index < [items count]; index++)
{
Asset *curr = [items objectAtIndex:index];
NSString *identifier = [NSString stringWithFormat:@"%@/%@", [curr title], [curr author]];
// this is very fast constant time lookup in a hash table
if ([lookup containsObject:identifier])
{
NSLog(@"item already exists. removing: %@ at index %d", identifier, index);
[items removeObjectAtIndex:index];
}
else
{
NSLog(@"distinct item. keeping %@ at index %d", identifier, index);
[lookup addObject:identifier];
}
}
NSLog(@"****Filtered****");
print(items);
[pool drain];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
Craplet[11991:707] ****Original****
Craplet[11991:707] Developer/John Smith
Craplet[11991:707] Writer/Steve Johnson
Craplet[11991:707] Developer/John Smith
Craplet[11991:707] distinct item. keeping Developer/John Smith at index 0
Craplet[11991:707] distinct item. keeping Writer/Steve Johnson at index 1
Craplet[11991:707] item already exists. removing: Developer/John Smith at index 2
Craplet[11991:707] ****Filtered****
Craplet[11991:707] Developer/John Smith
Craplet[11991:707] Writer/Steve Johnson
Run Code Online (Sandbox Code Playgroud)