2012-04-19 4 views
3

Qeustion: Assez comme indiqué dans le titre. J'ai regardé sur Internet, mais je ne trouve rien qui soit facile à comprendre. J'ai NSArray qui contient beaucoup NSValue. Ceux NSValue détiennent chacun un CGPoint. Je veux les trier par x puis par y seconde.iOS: Trier NSArray de NSValue emballage CGPoint

Certains Code:

NSValue * valuePointObject = [NSValue valueWithCGPoint:CGPointMake(x, y)]; 
NSArray *array = [[NSArray alloc] initWithObjects: valuePointObject, valuePointObject2, ..., nil]; 

Répondre

9

Pour trier les valeurs que vous aurez à 'Unbox' les à nouveau Points Cg. Le code peut être comme:

NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(NSValue *obj1, NSValue *obj2) { 
     CGPoint p1 = [obj1 CGPointValue]; 
     CGPoint p2 = [obj2 CGPointValue]; 
     if (p1.x == p2.x) return p1.y < p2.y; 
     return p1.x < p2.x; 
    }]; 
+0

C'est exactement ce que je cherche. Bon code. Merci! – Byte

4
array = [array sortedArrayUsingComparator:^NSComparisonResult(NSValue *obj1, NSValue *obj2) { 

     if (obj1.CGPointValue.x < obj2.CGPointValue.x) { 
      return NSOrderedAscending; 
     } 

     if (obj1.CGPointValue.x > obj2.CGPointValue.x) { 
      return NSOrderedDescending; 
     } 

     if (obj1.CGPointValue.y < obj2.CGPointValue.y) { 
      return NSOrderedAscending; 
     } 

     if (obj1.CGPointValue.y > obj2.CGPointValue.y) { 
      return NSOrderedDescending; 
     } 

     return NSOrderedSame; 
    }];