我想作的事情彷佛很简单,但我在网上找不到任何答案。 我有一个NSMutableArray
对象,让咱们说它们是'Person'对象。 我想经过Person.birthDate对NSMutableArray
进行排序,这是一个NSDate
。 ios
我认为这与这个方法有关: git
NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(???)];
在Java中,我会使个人对象实现Comparable,或者使用带有内联自定义比较器的Collections.sort ...你到底如何在Objective-C中执行此操做? github
若是您只是对NSNumbers
数组进行排序,可使用1次调用对它们进行排序: 数组
[arrayToSort sortUsingSelector: @selector(compare:)];
这是有效的,由于数组中的对象( NSNumber
对象)实现了compare方法。 您能够为NSString
对象执行相同的操做,甚至能够对实现比较方法的自定义数据对象数组执行相同的操做。 app
这是使用比较器块的一些示例代码。 它对一组字典进行排序,其中每一个字典在一个键“sort_key”中包含一个数字。 优化
#define SORT_KEY @\"sort_key\" [anArray sortUsingComparator: ^(id obj1, id obj2) { NSInteger value1 = [[obj1 objectForKey: SORT_KEY] intValue]; NSInteger value2 = [[obj2 objectForKey: SORT_KEY] intValue]; if (value1 > value2) { return (NSComparisonResult)NSOrderedDescending; } if (value1 < value2) { return (NSComparisonResult)NSOrderedAscending; } return (NSComparisonResult)NSOrderedSame; }];
上面的代码经过为每一个排序键获取整数值并比较它们的工做,做为如何执行它的说明。 因为NSNumber
对象实现了一个比较方法,所以能够更简单地重写它: google
#define SORT_KEY @\"sort_key\" [anArray sortUsingComparator: ^(id obj1, id obj2) { NSNumber* key1 = [obj1 objectForKey: SORT_KEY]; NSNumber* key2 = [obj2 objectForKey: SORT_KEY]; return [key1 compare: key2]; }];
或者比较器的主体甚至能够蒸馏到1行: spa
return [[obj1 objectForKey: SORT_KEY] compare: [obj2 objectForKey: SORT_KEY]];
我倾向于喜欢简单的语句和许多临时变量,由于代码更容易阅读,更容易调试。 不管如何,编译器都会优化临时变量,所以对于一体化版本没有任何优点。 调试
-(NSMutableArray*) sortArray:(NSMutableArray *)toBeSorted { NSArray *sortedArray; sortedArray = [toBeSorted sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { return [a compare:b]; }]; return [sortedArray mutableCopy]; }
我建立了一个类别方法的小型库,名为Linq to ObjectiveC ,这使得这类事情变得更加容易。 使用带有键选择器的sort方法,您能够按birthDate
排序,以下所示: code
NSArray* sortedByBirthDate = [input sort:^id(id person) { return [person birthDate]; }]
我刚刚根据自定义要求进行了多级排序。
//对值进行排序
[arrItem sortUsingComparator:^NSComparisonResult (id a, id b){ ItemDetail * itemA = (ItemDetail*)a; ItemDetail* itemB =(ItemDetail*)b; //item price are same if (itemA.m_price.m_selling== itemB.m_price.m_selling) { NSComparisonResult result= [itemA.m_itemName compare:itemB.m_itemName]; //if item names are same, then monogramminginfo has to come before the non monograme item if (result==NSOrderedSame) { if (itemA.m_monogrammingInfo) { return NSOrderedAscending; }else{ return NSOrderedDescending; } } return result; } //asscending order return itemA.m_price.m_selling > itemB.m_price.m_selling; }];
https://sites.google.com/site/greateindiaclub/mobil-apps/ios/multilevelsortinginiosobjectivec
NSMutableArray *stockHoldingCompanies = [NSMutableArray arrayWithObjects:fortune1stock,fortune2stock,fortune3stock,fortune4stock,fortune5stock,fortune6stock , nil]; NSSortDescriptor *sortOrder = [NSSortDescriptor sortDescriptorWithKey:@"companyName" ascending:NO]; [stockHoldingCompanies sortUsingDescriptors:[NSArray arrayWithObject:sortOrder]]; NSEnumerator *enumerator = [stockHoldingCompanies objectEnumerator]; ForeignStockHolding *stockHoldingCompany; NSLog(@"Fortune 6 companies sorted by Company Name"); while (stockHoldingCompany = [enumerator nextObject]) { NSLog(@"==============================="); NSLog(@"CompanyName:%@",stockHoldingCompany.companyName); NSLog(@"Purchase Share Price:%.2f",stockHoldingCompany.purchaseSharePrice); NSLog(@"Current Share Price: %.2f",stockHoldingCompany.currentSharePrice); NSLog(@"Number of Shares: %i",stockHoldingCompany.numberOfShares); NSLog(@"Cost in Dollars: %.2f",[stockHoldingCompany costInDollars]); NSLog(@"Value in Dollars : %.2f",[stockHoldingCompany valueInDollars]); } NSLog(@"===============================");