配列の差分 PerlとObjective-C

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];

こんな感じになるのかと.もう少し簡潔にかけるのかもしれないですけど.

カテゴリー: 技術的なこと パーマリンク