Jos
Jos

Reputation: 2471

Sorting 2-dimensional arrays

I have the following case. I import data from an xml feed and from facebook graph api, in this case posts. I want to merge this data in a array and sort this on the included date data.

I have now the following:

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

This creates a 2-dimensional array, but i want to order all the entries on created_time.

How can i best solve this problem? Thnx in advance!!

Upvotes: 0

Views: 810

Answers (1)

Nick Weaver
Nick Weaver

Reputation: 47241

Create a data class containing the necessary instance variables instead of the mutable array. Then you can use the various sort method of the NSArray class, for example sortedArrayUsingDescriptors.

A sort could look like this:

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

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

[sortDescriptor release];

EDIT

To quote Mr. Fowler from his book Refactoring: Improving the Design of Existing Code.

Replace Array with Object

You have an array in which certain elements mean different things.

Replace the array with an object that has a field for each element

...

Motivation

Arrays are a common structure for organizing data. However, they should be used only to contain a collection of similar objects in somre order.

That's what we want to do here. Let's create a simple Posts class. You can easily add your custom initializer which accepts the four values as parameters, or even a convenience class method to return an autoreleased object later on. This is just a basic skeleton:

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;
}

EDIT 2

Adding a Post object to your array:

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];

Upvotes: 5

Related Questions