簡體   English   中英

排序對象的NSArray WRT對象中包含在NSSet中的對象

[英]Sorting an NSArray of Objects WRT the objects contained in NSSet in those objects

所以這是層次結構:

NSArray A包含3個對象。 每個自定義對象都包含另一個自定義對象的NSSet 每個“另一個自定義對象”都包含一個數字。

我想按該數字對NSArray A進行排序。 我不在乎集合中的哪個對象被拾取。 該集合中的任何對象都可以。

關於如何使用NSSortDescriptor任何線索?

鍵值編碼還可以與自定義對象的屬性(甚至實例變量)一起使用,如以下示例所示。 但是您必須指定一個應用於集合的集合運算符,以選擇要排序的對象,例如@max@min@avg

// The "inner object", containing a number:
@interface Custom1 : NSObject
@property (nonatomic, strong) NSNumber *number;
@end

@implementation  Custom1
@end

// The "outer object", containing a set of "inner" objects:
@interface Custom2 : NSObject
@property (nonatomic, strong) NSSet *others; // set of "Custom1 objects.
@end

@implementation  Custom2
@end

現在,您可以執行以下操作:

Custom1 *o1 = [[Custom1 alloc] init];
o1.number = @1;
Custom1 *o2 = [[Custom1 alloc] init];
o2.number = @2;
Custom2 *p1 = [[Custom2 alloc] init];
p1.others = [NSSet setWithObjects:o1, o2, nil];

Custom1 *o3 = [[Custom1 alloc] init];
o3.number = @3;
Custom1 *o4 = [[Custom1 alloc] init];
o4.number = @4;
Custom2 *p2 = [[Custom2 alloc] init];
p2.others = [NSSet setWithObjects:o3, o4, nil];

NSArray *array = @[p1, p2];

// Sort according to maximum number in the inner object set:
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"others.@max.number" ascending:YES];
NSArray *sortedArray = [array sortedArrayUsingDescriptors:@[sort]];

由於數據存儲在NSArray ,因此可以使用塊來完成排序,這對於排序描述符來說是比較器。 請注意,這種方法不適用於SQLite支持的Core Data提取,后者直接對存儲在基礎數據庫中的屬性值進行排序。

有幾種解決方法,這是直截了當的,與行人接壤(我希望我的數據結構正確):

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

如果想花哨的話,可以在自定義對象上實現比較兩個對象的方法,然后使用該方法創建排序描述符,也可以聲明一個只讀屬性,例如返回該對象的max或min值。 NSSet ,然后僅對該屬性使用普通的排序描述符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM