2012-02-09 34 views
2

我有一個字典數組。 各詞典是這樣iPhone - 按CGRect的起源對字典數組進行排序。x

object, @"myObject", 
[NSValue valueWithCGRect:myRect], @"rect", 
nil 

如何排序myRect.origin.x該陣列?

我知道objective-c有一些聰明的方法來排序字典數組。我的問題在於,我想按照myRect的x座標進行排序,並且myRect被封裝在一個NSValue中......用魔術命令來做到這一點的任何方式?我知道你們是魔術師! :D

謝謝。

回答

8

的乾淨的方法可能是使用像sortUsingComparator:sortedArrayUsingComparator(取決於陣列的可變性)的方法和定義自定義比較器(一個塊以兩個參數並返回一個NSComparisonResult),該解包您rects並比較它們的x座標 - 。

編輯:好吧,既然大家都在提供代碼,這裏是我的:

[array sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    CGRect rect1 = [[obj1 valueForKey:@"rect"] CGRectValue]; 
    CGRect rect2 = [[obj2 valueForKey:@"rect"] CGRectValue]; 

    if(rect1.origin.x < rect2.origin.x) { 
     return NSOrderedAscending; 
    } else if(rect1.origin.x > rect2.origin.x) { 
     return NSOrderedDescending; 
    } else { 
     return NSOrderedSame; 
    } 
}]; 
+1

YESSSSSSSSSSSSSS!我知道你們是魔術師!!!!!謝謝! – SpaceDog 2012-02-09 02:23:00

3

沒有什麼神奇的,但它不是免費的,無論是。 :)你正在尋找-[NSArray sortedArrayUsingComparator:]。如果您的陣列是NSMutableArray,那麼您可以使用-[NSMutableArray sortUsingComparator:]

比較器是一個返回NSComparisonResult並取兩個對象的塊。下面是NSObjCRuntime.h定義:

typedef NSComparisonResult (^NSComparator)(id obj1, id obj2); 

塊應該採取的對象,將它們轉換成字典,從每個後提取NSValues到rects並返回比較X座標字段的結果。

僞代碼,假設NSMutableArray

[myArray sortUsingComparator:^(id obj1, id obj2) { 
    NSDictionary *dict1 = (NSDictionary *)obj1; 
    NSDictionary *dict2 = (NSDictionary *)obj2; 
    // Extract each of the NSValues 
    // Compare the x values 
    if (xValue1 == xValue2) return NSOrderedSame; 
    return (xValue1 < xValue2) ? NSOrderedAscending : NSOrderedDescending; 
}]; 
+0

謝謝!!!!!!!!!!!! – SpaceDog 2012-02-09 02:23:49

1

這應該這樣做(這並不完全是一個班輪恐怕):

NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^(id obj1, id obj2) { 
    ([[obj1 objectForKey:@"rect"] CGRectValue].x < [[obj2 objectForKey:@"rect"] CGRectValue].x)? NSOrderedAscending : NSOrderedDescending; 
}];