2011-11-19 56 views
2

晚上好。如何對NSMutableArray進行排序?代碼審查需要

此代碼有效。它根據西裝和卡片價值排列一系列卡片。這也是非常強大的力量。你能推薦一個更好的方法嗎? Objective-C是否幫助處理對象被排序的情況有多個字段,排序依賴於哪個字段?

-(void) sort: (NSMutableArray *) deck {   
    NSUInteger count = [deck count]; 

    Card *thisCard; 
    Card *nextCard; 

    int this; 
    int next; 

    BOOL stillSwapping = true; 

    while (stillSwapping) { 

     stillSwapping = false; 

     for (NSUInteger i = 0; i < count; ++i) { 
      this = i; 
      next = i+1; 

      if (next < count) { 

       thisCard = [deck objectAtIndex:this]; 
       nextCard = [deck objectAtIndex:next]; 

       if ([thisCard suit] > [nextCard suit]) {       
        [deck exchangeObjectAtIndex:this withObjectAtIndex:next]; 
        stillSwapping = true; 
       } 


       if ([thisCard suit] == [nextCard suit]) { 
        if ([thisCard value] > [nextCard value]) { 
         [deck exchangeObjectAtIndex:this withObjectAtIndex:next]; 
         stillSwapping = true; 
        } 
       } 
      } 
     } 
    } 
} 

回答

7

您有幾個選擇。

也許最簡單的方法是在Card上定義方法-compare:,該方法返回NSComparisonResult。如果按套裝和價值排序是對Card進行排序的「標準」方式,則這是更可取的。如果你做到了這一點,那麼你的整個排序方法可以變成

[deck sortUsingSelector:@selector(compare:)]; 

如果你不想這樣做,你可以使用NSSortDescriptor S,一個是西裝,一個值的數組。

[deck sortUsingDescriptors:[NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"suit" ascending:YES], [NSSortDescriptor sortDescriptorWithKey:@"value"] ascending:YES], nil]]; 

如果這不因任何原因失效,你可以嘗試-sortUsingComparator:

[deck sortUsingComparator:^NSComparisonResult(Card *obj1, Card *obj2) { 
    int suit1 = [obj1 suit]; 
    int suit2 = [obj2 suit]; 
    if (suit1 > suit2) { 
     return NSOrderedDescending; 
    } else if (suit1 < suit2) { 
     return NSOrderedAscending; 
    } else { 
     id value1 = [obj1 value]; 
     id value2 = [obj2 value]; 
     if (value1 > value2) { 
      return NSOrderedDescending; 
     } else if (value1 < value2) { 
      return NSOrderedAscending; 
     } else { 
      return NSOrderedSame; 
     } 
    } 
} 
+0

+ 1 - 漂亮的代碼示例 – bryanmac

+0

很不錯確實如此。謝謝 – JAM

+2

優秀的答案。我建議在你的類上使用實現'compare:'的建議(使用塊中的代碼進行比較)。 – bbum

相關問題