Sort NSArray with custom objects

这一生的挚爱 提交于 2019-12-05 20:31:29

问题


In my Xcode project I have the following classes:

Address

@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

Location

@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

In an subclass of UITableViewController, there is a NSArray containing a lot of unsorted objects of LDLocations. Now, I want to sort the NSArray's objects ascending based on the property city of a LDAddress.

How can I sort the array using NSSortDescriptor? I tried the following, but the app dumps when sorting the array.

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

回答1:


Try making the first key lowercase.

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



回答2:


You can also sort an array with blocks:

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



回答3:


This will allow to sort with multiple types. Like we need to sort the Movie based on time and if the time is equal then need to sort by name.

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



回答4:


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


来源:https://stackoverflow.com/questions/10853363/sort-nsarray-with-custom-objects

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!