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];
こんな感じになるのかと.もう少し簡潔にかけるのかもしれないですけど.