2010-05-04 5 views
6

현재 내 서재에서 HTTP 서블릿에서 가져온 일부 데이터를 저장하기 위해 NSMutableArrays을 사용하고 있습니다.Objective-C : NSMutableArrays를 포함하는 NSMutableArray 정렬

내 배열에있는 내용을 정렬해야하므로 모든 것이 좋습니다.

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 일 내가 배열 하강을 정렬 할 점이다

이 내가 할 것입니다.

데이터를 저장하는 방식이 좋은가요? NSMutableArrayNSMutableArrays을 사용하는 것보다 더 좋은 방법이 있습니까?

저는 dev에 익숙한 데, 정렬에 대한 코드를 보았지만 좋았습니다.

미리 답변 해 주셔서 감사합니다.

+1

이 자체 오류는 아니지만'말을 좋은 스타일이 아니다 :

이처럼 수행 [[NSMutableArray를 arrayWithObjects을 : 전무] 유지]'. 대신'[NSMutableArray initWithObjects : nil]'을 사용해야합니다. –

+0

실제로 [[[NSMutableArray alloc] init]'을 사용해야합니다. –

+0

또는'[NSMutableArray array]'. –

답변

10

배열을 사용하는 대신 사용자 지정 개체를 만들거나 (적어도 NSDictionary을 사용하는 경우) 정보를 저장하는 것이 훨씬 쉽습니다. 예를 들어

: 당신이 당신의 scores 배열을 채워하면

//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 

, 당신은 지금 할 수있는 :

//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 배열은 점수를 오름차순으로 정렬됩니다.

+0

도움을 주셔서 감사합니다. 내 개체를 만들었으므로 이전보다 내 데이터를 정렬하는 것이 훨씬 쉽습니다. 왜 단순한 int 대신 NSUInteger를 사용합니까? – Dough

+1

@Dough'NSUInteger'는 실행중인 플랫폼에 따라 32 비트 또는 64 비트가됩니다. 'int'는 항상 32 비트가 될 것이고, 정수를 사용하기 위해 선호되고 권장되는 방법입니다. –

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

답장을 보내 주셔서 감사합니다. 제 경우에는 제 자신의 물건을 사용하는 것을 선호하지만, 이것도 좋은 것으로 생각합니다 : D – Dough