Objective-C:对包含NSMutableArrays的NSMutableArray进行排序

6

我目前在开发中使用NSMutableArrays来存储从HTTP Servlet获取的一些数据。

一切都很好,但现在我需要对数组中的内容进行排序。

这是我的做法:

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

第一列包含一个标签,第二列是得分,我希望对数组进行降序排序。

我存储数据的方式是否正确?有没有比在NSMutableArray中使用NSMutableArrays更好的方法?

我对iPhone开发不太熟悉,看到一些关于排序的代码,但感觉不太好。

提前感谢您的回答!


1
这并不是一个错误,但是这种写法不太好。比如说[[NSMutableArray arrayWithObjects:nil] retain],你应该使用[NSMutableArray initWithObjects:nil] - Adam Rosenfield
实际上,你应该只使用[[NSMutableArray alloc] init] - Rob Keniger
或者 [NSMutableArray array] - Hot Licks
我不知道你可以在数组中插入整数。这是一个新功能吗? - Hot Licks
2个回答

10
这将会更容易些,如果你创建一个自定义对象(或者至少使用一个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数组将按照分数升序排列。


非常感谢您的帮助!我创建了自己的对象,现在排序数据比以前更容易了。为什么要使用NSUInteger而不是简单的int? - Dough
1
@Dough NSUInteger 的位数取决于它所运行的平台,可能是32位或64位。int 始终为32位,并且是使用整数的首选和推荐方式。 - Dave DeLong

5

对于如此微不足道的东西,您无需创建自定义类,这是一种浪费代码的行为。您应该使用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]];

谢谢你的回答!在我的情况下,我更喜欢使用自己的对象,但我认为这也是一个不错的选择 :D - Dough

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接