2

したがって、階層は次のとおりです。

NSArrayA には 3 つのオブジェクトが含まれています。これらの各カスタム オブジェクトにはNSSet、別のカスタム オブジェクトが含まれています。これらの「別のカスタム オブジェクト」にはそれぞれ番号が含まれています。

NSArrayその番号でAをソートしたい。セット内のどのオブジェクトが選択されたかは気にしません。そのセットのどのオブジェクトでも問題ありません。

でそれを行う方法についての手がかりはありNSSortDescriptorますか?

4

2 に答える 2

2

データはブロックに格納されるためNSArray、ブロックを使用してソートを行うことができます。このブロックは、ソート記述子でコンパレーターとして認識されます。このアプローチは、基になるデータベースに格納されているプロパティ値に基づいて直接ソートする、SQLite を使用したコア データ フェッチでは機能しないことに注意してください。

これにはいくつかの方法がありますが、これは単純で、歩行者に隣接しています (データ構造が正しいことを願っています)。

NSArray *data = @[
    @{@"otherobjects":[NSSet setWithObjects: @{@"num":@2}, @{@"num":@1}, @{@"num":@4}, nil]},
    @{@"otherobjects":[NSSet setWithObjects:@{@"num":@7}, @{@"num":@9}, @{@"num":@8}, nil]}
];

NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"otherobjects" ascending:NO comparator:^NSComparisonResult(id obj1, id obj2) {

    NSNumber *n1 = [[obj1 anyObject] valueForKey:@"num"];
    NSNumber *n2 = [[obj2 anyObject] valueForKey:@"num"];
    return [n1 compare: n2];
}];

NSArray *sorted = [data sortedArrayUsingDescriptors:@[sd]];

凝りたい場合は、2 つのオブジェクトを比較するメソッドをカスタム オブジェクトに実装し、そのメソッドを使用して並べ替え記述子を作成するか、たとえば、オブジェクトの最大値または最小値を返す読み取り専用プロパティを宣言することができます。NSSet、そのプロパティで通常のソート記述子を使用するだけです。

于 2013-04-10T11:34:07.617 に答える