【问题标题】:Objective-C : Sorting NSMutableArray containing NSMutableArraysObjective-C:对包含 NSMutableArrays 的 NSMutableArray 进行排序
【发布时间】:2010-05-04 16:13:42
【问题描述】:

我目前在我的开发中使用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 开发新手,我看过一些关于排序的代码,但感觉不太好。

提前感谢您的回答!

【问题讨论】:

  • 这本身不是错误,但说[[NSMutableArray arrayWithObjects:nil] retain] 的风格不好。相反,您应该只使用[NSMutableArray initWithObjects:nil]
  • 其实你应该用[[NSMutableArray alloc] init].
  • [NSMutableArray array]
  • (我不知道您可以将整数插入数组中。这是一个新功能吗?)

标签: objective-c sorting nsmutablearray


【解决方案1】:

如果您要创建自定义对象(或至少使用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 NSUInteger 将是 32 位或 64 位,具体取决于它运行的平台。 int 始终为 32 位,是使用整数的首选和推荐方式。
【解决方案2】:

您不需要为如此琐碎的事情创建自定义类,这是对代码的浪费。您应该使用 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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 2021-05-14
  • 1970-01-01
  • 2015-08-20
  • 2011-10-30
  • 1970-01-01
相关资源
最近更新 更多