Skip to content

Instantly share code, notes, and snippets.

@zerodivisi0n
Created December 16, 2012 17:15
Show Gist options
  • Save zerodivisi0n/4309728 to your computer and use it in GitHub Desktop.
Save zerodivisi0n/4309728 to your computer and use it in GitHub Desktop.
finding differences of two arrays
NSArray *a = [NSArray arrayWithObjects:@"a", @"c", @"d", @"b", @"k", nil];
NSArray *b = [NSArray arrayWithObjects:@"z", @"a", @"d", @"b", @"m", nil];
NSComparator comparator = ^NSComparisonResult(id obj1, id obj2) {
return [obj1 caseInsensitiveCompare:obj2];
};
NSArray *sortedA = [a sortedArrayUsingComparator:comparator];
NSArray *sortedB = [b sortedArrayUsingComparator:comparator];
NSLog(@"a=%@, b=%@", sortedA, sortedB);
NSMutableArray *added = [NSMutableArray array];
NSMutableArray *updated = [NSMutableArray array];
NSMutableArray *removed = [NSMutableArray array];
NSEnumerator *enumA = [sortedA objectEnumerator];
NSEnumerator *enumB = [sortedB objectEnumerator];
NSString *objA = [enumA nextObject];
NSString *objB = [enumB nextObject];
while (objA && objB) {
NSComparisonResult result = comparator(objA, objB);
switch (result) {
case NSOrderedSame:
[updated addObject:objA];
objA = [enumA nextObject];
objB = [enumB nextObject];
break;
case NSOrderedAscending:
[removed addObject:objA];
objA = [enumA nextObject];
break;
case NSOrderedDescending:
[added addObject:objB];
objB = [enumB nextObject];
break;
default:
assert("This should not happen");
break;
}
}
// objA, enumA -> removed
while (objA) {
[removed addObject:objA];
objA = [enumA nextObject];
}
// objB, enumB -> added
while (objB) {
[added addObject:objB];
objB = [enumB nextObject];
}
NSLog(@"added=%@, updated=%@, removed=%@", added, updated, removed);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment