2012-06-01 154 views
8

在我的Xcode項目,我有以下類別:排序NSArray的自定義對象

地址

@interface LDAddress : NSObject{ 
    NSString *street; 
    NSString *zip; 
    NSString *city; 
    float latitude; 
    float longitude; 
} 

@property (nonatomic, retain) NSString *street; 
@property (nonatomic, retain) NSString *zip; 
@property (nonatomic, retain) NSString *city; 
@property (readwrite, assign, nonatomic) float latitude; 
@property (readwrite, assign, nonatomic) float longitude; 

@end 

位置

@interface LDLocation : NSObject{ 
    int locationId; 
    NSString *name; 
    LDAddress *address; 
} 
@property (readwrite, assign, nonatomic) int locationId; 
@property (nonatomic, retain) LDAddress *address; 
@property (nonatomic, retain) NSString *name; 

@end 

在的UITableViewController的子類,有一個包含大量LDLocations未排序對象的NSArray。現在,我想根據LDAddress的城市對NSArray的對象進行升序排序。

如何使用NSSortDescriptor對數組進行排序? 我嘗試了以下操作,但應用程序在對數組進行排序時轉儲。

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Address.city" ascending:YES]; 
[_locations sortedArrayUsingDescriptors:@[sortDescriptor]]; 
+0

你試過只是@ 「城市」 爲重點? –

回答

15

嘗試使第一個關鍵字小寫。

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"address.city" ascending:YES]; 
+0

我爲我工作完美=)謝謝 – PhilippS

14

您也可以排序與塊的數組:

NSArray *sortedLocations = [_locations sortedArrayUsingComparator: ^(LDAddress *a1, LDAddress *a2) { 
     return [a1.city compare:a2.city]; 
    }]; 
+0

我喜歡這種方法最好的! –

+0

我試過你的編碼,它工作,但我喜歡用NSSortDescriptor更多地排序數組。 – PhilippS

+0

完全工作謝謝你... –

3

這將使具有多種類型進行排序。就像我們需要根據時間對電影進行排序,如果時間相同,則需要按名稱排序。

NSArray *sortedArray = [childrenArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 
     NSNumber *first = [NSNumber numberWithLong:[(Movie*)a timeInMillis]]; 
     NSNumber *second = [NSNumber numberWithLong:[(Movie*)b timeInMillis]]; 
     NSComparisonResult result = [first compare:second]; 
     if(result == NSOrderedSame){ 
      result = [((NSString*)[(Movie*)a name]) compare:((NSString*)[(Movie*)b name])]; 
     } 
     return result; 
    }]; 
1
-(NSArray*)sortedWidgetList:(NSArray*)widgetList 
{ 
    NSSortDescriptor *firstDescriptor = [[NSSortDescriptor alloc] initWithKey:@"itemNum" ascending:YES]; 

    NSArray *sortDescriptors = [NSArray arrayWithObjects:firstDescriptor, nil]; 

    NSArray *sortedArray = [widgetList sortedArrayUsingDescriptors:sortDescriptors]; 

    return sortedArray; 
} 
相關問題