1. ホーム
  2. ios

[解決済み] カスタムオブジェクトを含むNSMutableArrayをソートするにはどうすればよいですか?

2022-03-17 01:25:34

質問

やりたいことは簡単そうなのですが、ウェブで調べても答えが見つかりません。私は NSMutableArray のオブジェクトで、仮にそれらが「Person」オブジェクトだとします。をソートしたいのです。 NSMutableArray であるPerson.birthDateが NSDate .

このメソッドと関係があるのだと思います。

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

Javaでは、私のオブジェクトにComparableを実装させるか、インラインのカスタムコンパレータでCollections.sortを使用することになります。

解決方法は?

比較方法

オブジェクトにcompare-methodを実装するかどうか。

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

配列に複数のキーを追加することで、簡単に複数のキーでソートすることができます。カスタムの comparator-methods を使用することも可能です。以下の例を見てください。 ドキュメント .

ブロック(ピカピカ)

Mac OS X 10.6とiOS 4から、ブロックでのソートも可能になりました。

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

パフォーマンス

-compare: とブロックベースのメソッドを使用した場合、一般的に NSSortDescriptor 後者はKVCに依存しているので。 の主な利点は NSSortDescriptor メソッドは、コードではなくデータを使ってソート順を定義する方法を提供することです。 NSTableView ヘッダー行をクリックすることで