カスタムオブジェクトを含む NSMutableArray をソートするにはどうすればいいですか? 質問する

カスタムオブジェクトを含む NSMutableArray をソートするにはどうすればいいですか? 質問する

私がやりたいことはかなり単純なようですが、Web 上で答えを見つけることができません。 のオブジェクトがあり、それらは「Person」オブジェクトであるとします。を、 である Person.birthDate でNSMutableArray並べ替えたいですNSMutableArrayNSDate

それはこの方法と関係があると思います:

NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(???)];

Java では、オブジェクトに Comparable を実装するか、インラインのカスタム比較演算子で Collections.sort を使用しますが、Objective-C ではこれをどうやって行うのでしょうか?

ベストアンサー1

比較方法

オブジェクトの比較メソッドを実装します。

- (NSComparisonResult)compare:(Person *)otherObject {
    return [self.birthDate compare:otherObject.birthDate];
}

NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(compare:)];

NSSortDescriptor (より良い)

または通常はさらに良い方法:

NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate"
                                           ascending:YES];
NSArray *sortedArray = [drinkDetails sortedArrayUsingDescriptors:@[sortDescriptor]];

配列に複数のキーを追加することで、複数のキーで簡単に並べ替えることができます。カスタム比較メソッドの使用も可能です。ドキュメント

ブロック(ピカピカ!)

Mac OS X 10.6 および iOS 4 以降では、ブロックを使用して並べ替えることもできます。

NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(Person *a, Person *b) {
    return [a.birthDate compare:b.birthDate];
}];

パフォーマンス

-compare:およびブロックベースの方法は、後者が KVC に依存しているため、一般的に を使用するよりもかなり高速になります。 この方法の主な利点は、コードNSSortDescriptorではなくデータを使用して並べ替え順序を定義する方法を提供することです。これにより、たとえば、ユーザーがヘッダー行をクリックしてNSSortDescriptor並べ替えることができるように設定することが容易になります。NSTableView

おすすめ記事