如何使用自定義對象對NSMutableArray進行排序?

我想作的事情彷佛很簡單,但我在網上找不到任何答案。 我有一個NSMutableArray對象,讓咱們說它們是'Person'對象。 我想經過Person.birthDate對NSMutableArray進行排序,這是一個NSDateios

我認爲這與這個方法有關: git

NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(???)];

在Java中,我會使個人對象實現Comparable,或者使用帶有內聯自定義比較器的Collections.sort ...你到底如何在Objective-C中執行此操做? github


#1樓

若是您只是對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]];

我傾向於喜歡簡單的語句和許多臨時變量,由於代碼更容易閱讀,更容易調試。 不管如何,編譯器都會優化臨時變量,所以對於一體化版本沒有任何優點。 調試


#2樓

-(NSMutableArray*) sortArray:(NSMutableArray *)toBeSorted 
{
  NSArray *sortedArray;
  sortedArray = [toBeSorted sortedArrayUsingComparator:^NSComparisonResult(id a, id b) 
  {
    return [a compare:b];
 }];
 return [sortedArray mutableCopy];
}

#3樓

我建立了一個類別方法的小型庫,名爲Linq to ObjectiveC ,這使得這類事情變得更加容易。 使用帶有鍵選擇器的sort方法,您能夠按birthDate排序,以下所示: code

NSArray* sortedByBirthDate = [input sort:^id(id person) {
    return [person birthDate];
}]

#4樓

我剛剛根據自定義要求進行了多級排序。

//對值進行排序

[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


#5樓

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(@"===============================");
相關文章
相關標籤/搜索