Objective-C: сортировка NSMutableArray, содержащего NSMutableArrays - PullRequest
6 голосов
/ 04 мая 2010

В настоящее время я использую NSMutableArrays в своих разработках для хранения данных, взятых из сервлета HTTP.

Все хорошо, так как теперь я должен отсортировать то, что находится в моем массиве.

Вот что я делаю:

NSMutableArray *array = [[NSMutableArray arrayWithObjects:nil] retain];
[array addObject:[NSArray arrayWithObjects: "Label 1", 1, nil]];
[array addObject:[NSArray arrayWithObjects: "Label 2", 4, nil]];
[array addObject:[NSArray arrayWithObjects: "Label 3", 2, nil]];
[array addObject:[NSArray arrayWithObjects: "Label 4", 6, nil]];
[array addObject:[NSArray arrayWithObjects: "Label 5", 0, nil]];

Первый столбец содержит метку, а 2-й - балл, который я хочу отсортировать по убыванию.

Является ли способ хранения моих данных хорошим? Есть ли лучший способ сделать это, чем использовать NSMutableArrays в NSMutableArray?

Я новичок в разработке для iPhone, я видел какой-то код о сортировке, но мне это не понравилось.

Заранее спасибо за ваши ответы!

Ответы [ 2 ]

10 голосов
/ 04 мая 2010

Это было бы намного проще, если бы вы создавали пользовательский объект (или хотя бы использовали NSDictionary) для хранения информации вместо использования массива.

Например:

//ScoreRecord.h
@interface ScoreRecord : NSObject {
  NSString * label;
  NSUInteger score;
}
@property (nonatomic, retain) NSString * label;
@property (nonatomic) NSUInteger score;
@end

//ScoreRecord.m
#import "ScoreRecord.h"
@implementation ScoreRecord 
@synthesize label, score;

- (void) dealloc {
  [label release];
  [super dealloc];
}

@end

//elsewhere:
NSMutableArray * scores = [[NSMutableArray alloc] init];
ScoreRecord * first = [[ScoreRecord alloc] init];
[first setLabel:@"Label 1"];
[first setScore:1];
[scores addObject:first];
[first release];
//...etc for the rest of your scores

Как только вы заполнили массив scores, теперь вы можете сделать:

//the "key" is the *name* of the @property as a string.  So you can also sort by @"label" if you'd like
NSSortDescriptor * sortByScore = [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:YES];
[scores sortUsingDescriptors:[NSArray arrayWithObject:sortByScore]];

После этого ваш массив scores будет отсортирован по возрастанию.

5 голосов
/ 05 мая 2010

Вам не нужно создавать собственный класс для чего-то такого тривиального, это пустая трата кода. Вы должны использовать массив NSDictionary (словарь в ObjC = хэш на других языках).

Сделай так:

  NSMutableArray * array = [NSMutableArray arrayWithObjects:
                            [NSDictionary dictionaryWithObject:@"1" forKey:@"my_label"],
                            [NSDictionary dictionaryWithObject:@"2" forKey:@"my_label"],
                            [NSDictionary dictionaryWithObject:@"3" forKey:@"my_label"],
                            [NSDictionary dictionaryWithObject:@"4" forKey:@"my_label"],
                            [NSDictionary dictionaryWithObject:@"5" forKey:@"my_label"],
                            nil];
  NSSortDescriptor * sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"my_label" ascending:YES] autorelease];
  [array sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
...