2009-09-12 16 views
41

में कनवर्ट करें NSDictionary के लिए कुंजी के रूप में सरणी की वस्तुओं के एक int फ़ील्ड का उपयोग करके NSArray को NSDictionary में कैसे परिवर्तित कर सकता हूं?NSArray को NSDictionary

उत्तर

51
- (NSDictionary *) indexKeyedDictionaryFromArray:(NSArray *)array 
{ 
    id objectInstance; 
    NSUInteger indexKey = 0U; 

    NSMutableDictionary *mutableDictionary = [[NSMutableDictionary alloc] init]; 
    for (objectInstance in array) 
    [mutableDictionary setObject:objectInstance forKey:[NSNumber numberWithUnsignedInt:indexKey++]]; 

    return (NSDictionary *)[mutableDictionary autorelease]; 
} 
9

यह NSArray पर एक श्रेणी एक्सटेंशन जोड़ता है। C99 मोड की आवश्यकता है (जो इन दिनों डिफ़ॉल्ट है, लेकिन बस मामले में)।

एक .h फ़ाइल कहीं कि #import सभी ने एड हो सकते हैं ..

@interface NSArray (indexKeyedDictionaryExtension) 
- (NSDictionary *)indexKeyedDictionary 
@end 

एक .m फ़ाइल में ..

@implementation NSArray (indexKeyedDictionaryExtension) 

- (NSDictionary *)indexKeyedDictionary 
{ 
    NSUInteger arrayCount = [self count]; 
    id arrayObjects[arrayCount], objectKeys[arrayCount]; 

    [self getObjects:arrayObjects range:NSMakeRange(0UL, arrayCount)]; 
    for(NSUInteger index = 0UL; index < arrayCount; index++) { objectKeys[index] = [NSNumber numberWithUnsignedInteger:index]; } 

    return([NSDictionary dictionaryWithObjects:arrayObjects forKeys:objectKeys count:arrayCount]); 
} 

@end 

उदाहरण उपयोग:

NSArray *array = [NSArray arrayWithObjects:@"zero", @"one", @"two", NULL]; 
NSDictionary *dictionary = [array indexKeyedDictionary]; 

NSLog(@"dictionary: %@", dictionary); 

आउटपुट:

2009-09-12 08:41:53.128 test[66757:903] dictionary: { 
    0 = zero; 
    1 = one; 
    2 = two; 
} 
+1

मुझे श्रेणियों का उपयोग करना अच्छा लगता है, इसलिए मैं इसे सीधे ऑब्जेक्ट पर कॉल करने के तरीके के कारण एक सरल फ़ंक्शन का उपयोग करने के बजाय इस समाधान को प्रीफर कर दूंगा, जैसे कि यह हमेशा उस विधि को जानता था। – Woofy

-2

मैंने Linq to ObjectiveC नामक एक साधारण लाइब्रेरी बनाई है, जो कि विधियों का संग्रह है जो इस तरह की समस्या को हल करने में बहुत आसान बनाता है।

NSDictionary* dictionary = [sourceArray toDictionaryWithKeySelector:^id(id item) { 
    return [item intField]; 
}]; 

यह एक शब्दकोश जहां कुंजी स्रोत सरणी में intField द्वारा दिया जाता है देता है: अपने मामले में आप Linq-to-ObjectiveC toDictionary विधि है, जहां अपने 'int' फ़ील्ड एक प्रमुख चयनकर्ता के माध्यम से निर्दिष्ट किया जाता है की जरूरत है।

71

इस जादू का प्रयास करें:

NSDictionary *dict = [NSDictionary dictionaryWithObjects:records 
            forKeys:[records valueForKey:@"intField"]]; 

FYI करें इस वजह से संभव हो सकता है इस में निर्मित सुविधा:

@interface NSArray(NSKeyValueCoding) 

/* Return an array containing the results of invoking -valueForKey: 
on each of the receiver's elements. The returned array will contain 
NSNull elements for each instance of -valueForKey: returning nil. 
*/ 
- (id)valueForKey:(NSString *)key; 
+0

यह वास्तव में एक जादू है! सुरुचिपूर्ण और वास्तव में आसान समाधान! बस एक नोट: शायद उपयोग करने के लिए बेहतर [रिकॉर्ड्स वैल्यू फोर्के: @ "अन्य फ़ील्ड"] सिर्फ रिकॉर्ड नहीं, क्योंकि इसमें "इंटीफिल्ड" भी शामिल होगा। वैसे भी कोडिंग के वर्षों के बाद भी यह मेरे लिए नया है ... – BootMaker

1
- (NSDictionary *) indexKeyedDictionaryFromArray:(NSArray *)array 
{ 
    NSMutableDictionary *mutableDictionary = [[NSMutableDictionary alloc] init]; 
    [array enumerateObjectsUsingBlock: 
    ^(id obj, NSUInteger idx, BOOL *stop){ 
     NSNumber *index = [NSNumber numberWithInteger:idx]; 
     [mutableDictionary setObject:obj forKey:index]; 
    }]; 
    NSDictionary *result = [NSDictionary.alloc initWithDictionary:mutableDictionary]; 
    return result; 
} 
2

यह कर्मचारी सूची NSMutableArray से एक NSMutableDictionary बनाने का एक उदाहरण है :

NSMutableArray *emloyees = [[NSMutableArray alloc]initWithObjects:@"saman",@"Ruchira",@"Rukshan",@"ishan",@"Harsha",@"Ghihan",@"Lakmali",@"Dasuni", nil]; 

NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
for (NSString *word in emloyees) { 
NSString *firstLetter = [[word substringToIndex:1] uppercaseString]; 
letterList = [dict objectForKey:firstLetter]; 

if (!letterList) { 
    letterList = [NSMutableArray array]; 
    [dict setObject:letterList forKey:firstLetter]; 
} 
[letterList addObject:word];} NSLog(@"dic %@",dict);