iPhone - сортировка массива словарей по CGRect origin.x - PullRequest
2 голосов
/ 09 февраля 2012

У меня есть массив словарей.Каждый словарь выглядит так:

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

Как отсортировать этот массив по myRect.origin.x?

Я знаю, что у target-c есть умные способы сортировки массивов словарей.Моя проблема здесь в том, что я хочу отсортировать по координате x myRect, а myRect обернут в NSValue ... любой способ сделать это с помощью магической команды?Я знаю, что вы, ребята, волшебники!: D

спасибо.

Ответы [ 3 ]

8 голосов
/ 09 февраля 2012

Самым чистым способом, вероятно, является использование метода, подобного sortUsingComparator: или sortedArrayUsingComparator (в зависимости от изменчивости массива), и определения пользовательского компаратора (блока, принимающего два параметра и возвращающего NSComparisonResult), который распаковывает ваш ректы и сравни их х-координаты.

edit : Ну, так как все остальные предоставляют код, вот мой:

[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;
    }
}];
3 голосов
/ 09 февраля 2012

Нет магии, но и она не бесплатна.:) Вы ищете -[NSArray sortedArrayUsingComparator:].Если ваш массив NSMutableArray, то вы можете использовать -[NSMutableArray sortUsingComparator:].

. Компаратор - это блок, который возвращает NSComparisonResult и принимает два объекта.Вот определение в NSObjCRuntime.h:

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

Блок должен брать объекты, приводить их к словарям, извлекать значения NSV из каждого обратно в риты и возвращать результат сравнения полей координат X.*

Psuedocode, предполагая 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;
}];
1 голос
/ 09 февраля 2012

Это должно сделать это (боюсь, это не совсем строка):

NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^(id obj1, id obj2) {
    ([[obj1 objectForKey:@"rect"] CGRectValue].x < [[obj2 objectForKey:@"rect"] CGRectValue].x)? NSOrderedAscending : NSOrderedDescending;
}];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...