2010-05-04 18 views
6

मैं वर्तमान में HTTP Servlet से लिया गया कुछ डेटा संग्रहीत करने के लिए अपने विकास में NSMutableArrays का उपयोग कर रहा हूं।उद्देश्य-सी: NSMutableArray को छंटाई 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 एक स्कोर मैं सरणी उतरते क्रमबद्ध करना चाहते हैं:

यह मैं क्या कर रहा है।

क्या मैं अपना डेटा एक अच्छा संग्रह कर रहा हूं? में NSMutableArrays का उपयोग करने से ऐसा करने का कोई बेहतर तरीका है?

मैं आईफोन देव के लिए नया हूं, मैंने सॉर्टिंग के बारे में कुछ कोड देखा है लेकिन इसके साथ अच्छा महसूस नहीं हुआ।

आपके उत्तरों के लिए अग्रिम धन्यवाद!

+1

यह कोई त्रुटि नहीं है दर असल, लेकिन यह अच्छा शैली में कहने के लिए 'नहीं है [[NSMutableArray arrayWithObjects: शून्य] बनाए रखने]'। इसके बजाय आपको केवल '[NSMutableArray initWithObjects: nil]' का उपयोग करना चाहिए। –

+0

दरअसल, आपको केवल '[[एनएसएमयूटेबलएरे ऐलोक] init] का उपयोग करना चाहिए। –

+0

या '[एनएसएमयूटेबलएरे ऐरे]'। –

उत्तर

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 सरणी स्कोर आरोही द्वारा क्रमबद्ध किया जाएगा।

+0

आपकी मदद के लिए बहुत बहुत धन्यवाद! मैंने अपना खुद का ऑब्जेक्ट बनाया है, यह मेरे डेटा को सॉर्ट करने से पहले बहुत आसान है। आप सरल int के बजाय NSUInteger का उपयोग क्यों करते हैं? – Dough

+1

@Dough 'NSUInteger' 32 या 64 बिट होगा, यह किस प्लेटफ़ॉर्म पर चल रहा है इसके आधार पर। 'int' हमेशा 32 बिट्स होगा, और पूर्णांक का उपयोग करने का पसंदीदा और अनुशंसित तरीका होगा। –

5

आपको कुछ छोटे के लिए कस्टम क्लास बनाने की आवश्यकता नहीं है, यह कोड की बर्बादी है। आपको NSDictionary की एक सरणी का उपयोग करना चाहिए (अन्य भाषाओं में ओबीजेसी = हैश में शब्दकोश)।

इसे इस तरह कार्य करें:

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

इस उत्तर के लिए धन्यवाद! मैं अपने मामले में अपनी खुद की वस्तु का उपयोग करना पसंद करता हूं, लेकिन मुझे लगता है कि यह भी एक अच्छा हो सकता है: डी – Dough

संबंधित मुद्दे