Perlで配列の差分を求める必要がありました.
Perlの場合は簡単で,2つのリストarray1={a,b,c,d},array2={b,c,d,e}があったとき,これらの差分集合difference={a,e}は,
my @array1 = qw/a b c d/;
my @array2 = qw/b c d e/;
my @difference = %count = ();
foreach my $element(@array1,@array2){ $count{$element}++ }
foreach my $element(keys %count){
if($count{$element}==1){push @difference,$element;}
}
print "difference = @difference\n";
などで簡単に行えます.
連想配列%countというのを作って,そこにarray1,array2の各要素をキーとして順に入れていきます.
$count{$element}
という部分はキーに対する値を返すのだけれども,++が後置されているからスカラーコンテキストとして解釈されて,自動的にそのキーの数がカウントされていくことになる.
で,最後に値が1のキー(要素)だけを取り出せば完成.ということになります.
Perlは楽でいいなあと思いつつ,ふと,同じロジックでObjective-Cで書いたらどうなるのかということで,とりあえず書いてみました.
NSArray *array1 = [[NSArray alloc] initWithObjects:@"a",@"b",@"c",@"d", nil];
NSArray *array2 = [[NSArray alloc] initWithObjects:@"b",@"c",@"d",@"e", nil];
NSMutableArray *allarray = [[NSMutableArray alloc]initWithCapacity:0];
NSMutableArray *resultarray = [[NSMutableArray alloc]initWithCapacity:0];
for(NSString *tmp in array1){[allarray addObject:tmp];}
for(NSString *tmp in array2){[allarray addObject:tmp];}
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
for(NSString *tmp in allarray){
if([dic objectForKey:tmp] == nil){
[dic setObject:[NSNumber numberWithInt:1] forKey:tmp];
}else{
int num = [[dic objectForKey:tmp] intValue];
num++;
[dic setObject:[NSNumber numberWithInt:num] forKey:tmp];
}
}
for(NSString *tmp in [dic allKeys]){
if([[dic objectForKey:tmp] intValue]==1){
[resultarray addObject:tmp];
}
}
NSLog(@"difference = %@",resultarray);
[array1 release];
[array2 release];
[allarray release];
[resultarray release];
こんな感じになるのかと.もう少し簡潔にかけるのかもしれないですけど.