Сортировка 2-мерных массивов - PullRequest
0 голосов
/ 19 мая 2011

У меня следующий случай. Я импортирую данные из фида xml и из api graph facebook, в данном случае постов. Я хочу объединить эти данные в массив и отсортировать их по включенным данным даты.

Теперь у меня есть следующее:

[containerArray addObject: [NSMutableArray arrayWithObjects: created_time, message, picture, fbSource, nil ]
                    ];

Это создает 2-мерный массив, но я хочу упорядочить все записи в create_time.

Как мне лучше решить эту проблему? Спасибо заранее !!

1 Ответ

5 голосов
/ 19 мая 2011

Создайте класс данных, содержащий необходимые переменные экземпляра вместо изменяемого массива. Затем вы можете использовать различные методы сортировки класса NSArray, например sortedArrayUsingDescriptors.

Сортировка может выглядеть так:

NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"created_time" 
                                                                ascending:YES] autorelease];    

NSArray *sortedArray = [containerArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];

[sortDescriptor release];

EDIT

По словам г-на Фаулера из его книги Рефакторинг: улучшение дизайна существующего кода .

Заменить массив на объект

У вас есть массив, в котором определенные элементы означают разные вещи.

Заменить массив объектом, имеющим поле для каждого элемента

...

Мотивация

Массивы - это общая структура для организации данных. Однако их следует использовать только для того, чтобы содержать коллекцию похожих объектов в мрачном порядке.

Вот что мы хотим сделать здесь. Давайте создадим простой класс Posts. Вы можете легко добавить свой пользовательский инициализатор, который принимает четыре значения в качестве параметров, или даже метод вспомогательного класса для последующего возврата автоматически выпущенного объекта. Это просто базовый скелет:

Post.h

@interface Posts : NSObject 
{
    NSDate *created_time; 
    NSString *message;
    UIImage *picture;
    id fbSource; // Don't know what type :)
}

@property (nonatomic, retain) NSDate *created_time;
@property (nonatomic, copy) NSString *message;
@property (nonatomic, retain) UIImage *picture;
@property (nonatomic, retain) id fbSource;

@end

Post.m

#import "Post.h"

@implementation Post

@synthesize created_time, message, picture, fbSource;

#pragma mark -
#pragma mark memory management

- (void)dealloc 
{
    [created_time release];
    [message release];
    [picture release];
    [fbSource release];
    [super dealloc];
}

#pragma mark -
#pragma mark initialization

- (id)init
{
    self = [super init];
    if (self) {
        // do your initialization here
    }
    return self;
}

РЕДАКТИРОВАТЬ 2

Добавление объекта Post в ваш массив:

Post *newPost = [[Post alloc] init];
newPost.reated_time = [Date date];
newPost.message = @"a message";
newPost.picture = [UIImage imageNamed:@"mypic.jpg"];
// newPost.fbSource = ???
[containerArray addObject:newPost];

[newPost release];
...