読者です 読者をやめる 読者になる 読者になる

なかじまの開発ブログ

アプリ開発における備忘録などなど。

MENU

1つの配列のソートに合わせて、もう1つの配列の順番も変える【Objective-C】

Objective-C

2つの配列を用意。

NSArray *array1 = [NSArray arrayWithObjects:@"さしすせそ", @"かきくけこ", @"あいうえお", @"なにぬねの", @"たちつてと", nil];
NSArray *array2 = [NSArray arrayWithObjects:@"3行目", @"2行目", @"1行目", @"5行目", @"4行目", nil];

現在の順番

さしすせそ 3行目
かきくけこ 2行目
あいうえお 1行目
なにぬねの 5行目
たちつてと 4行目

そしてこの2つの配列を、ソートする方をキーとして『NSMutableDictionary』に格納します。
ここではarray2をソースします。

NSMutableDictionary *dic = [NSMutableDictionary dictionary];
for (int i = 0; i != array2.count; i++) {
  [dic setObject:[array1 objectAtIndex:i] forKey:[array2 objectAtIndex:i]];
}

array2を昇順にソートします。
配列の要素が文字列で、数字を数値として比較したい場合はオプションとして『NSNumericSearch』を使います。

array2 = [array2 sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
  NSStringCompareOptions options = (NSNumericSearch);
  return [obj1 compare:obj2 options:options]; // 降順にしたい場合はobj1とobj2を入れ替えてください。
}];

そして先ほど登録したNSMutableDictionaryをarray2で取り出し、別の配列に格納することによって順番を変えることができます。

NSMutableArray *array3 = [[NSMutableArray alloc] init];
for (int i = 0; i != array2.count; i++) {
  [array3 addObject:[dic objectForKey:[array2 objectAtIndex:i]]];
}

入れ替え後

あいうえお 1行目
かきくけこ 2行目
さしすせそ 3行目
たちつてと 4行目
なにぬねの 5行目

配列の要素が数値の場合は、

NSArray *array1 = [NSArray arrayWithObjects:@"さしすせそ", @"かきくけこ", @"あいうえお", @"なにぬねの", @"たちつてと", nil];
NSArray *array2 = [NSArray arrayWithObjects:@3, @2, @1, @5, @4, nil];

NSMutableDictionary *dic = [NSMutableDictionary dictionary];
for (int i = 0; i != array2.count; i++) {
  [dic setObject:[array1 objectAtIndex:i] forKey:[array2 objectAtIndex:i]];
}

NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:nil ascending:YES]; // 降順にしたい場合はNO
array2 = [array2 sortedArrayUsingDescriptors:@[sort]];

NSMutableArray *array3 = [[NSMutableArray alloc] init];
for (int i = 0; i != array2.count; i++) {
  [array3 addObject:[dic objectForKey:[array2 objectAtIndex:i]]];
}