2011-11-19 57 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

相关问题