2010-07-21 13 views
5

मैं एक सरणी है कि कुछ इस तरह दिखेगा सॉर्ट करने के लिए कोशिश कर रहा हूँ से एक NSArray सॉर्ट:एक NSDictionary मूल्य

NSDictionary *person1 = [NSDictionary dictionaryWithObjectsAndKeys:@"sam",@"name",@"28.00",@"age",nil]; 
NSDictionary *person2 = [NSDictionary dictionaryWithObjectsAndKeys:@"cody",@"name",@"100.00",@"age",nil]; 
NSDictionary *person3 = [NSDictionary dictionaryWithObjectsAndKeys:@"marvin",@"name",@"299.00",@"age",nil]; 
NSDictionary *person4 = [NSDictionary dictionaryWithObjectsAndKeys:@"billy",@"name",@"0.0",@"age",nil]; 
NSDictionary *person5 = [NSDictionary dictionaryWithObjectsAndKeys:@"tammy",@"name",@"54.00",@"age",nil]; 

NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:person1,person2,person3,person4,person5,nil]; 

// before sort 
NSLog(@"%@",arr); 

NSSortDescriptor *ageSorter = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES]; 
[arr sortUsingDescriptors:[NSArray arrayWithObject:ageSorter]]; 

// after sort 
NSLog(@"%@",arr); 
(कृपया मैं सिर्फ जरूरत बड़ी संख्या तथ्य इन लोगों को किसी भी जीवित उम्र पार अच्छी तरह से कर रहे हैं पर ध्यान न दें!)

अब से पहले तरह उत्पादन होगा:

2010-07-21 10:46:31.898 Sorting[70673:207] (
    { 
    age = "28.00"; 
    name = sam; 
}, 
    { 
    age = "100.00"; 
    name = cody; 
}, 
    { 
    age = "299.00"; 
    name = marvin; 
}, 
    { 
    age = "0.0"; 
    name = billy; 
}, 
    { 
    age = "54.00"; 
    name = tammy; 
} 

)

और प्रकार के बाद:

2010-07-21 10:46:31.900 Sorting[70673:207] (
    { 
    age = "0.0"; 
    name = billy; 
}, 
    { 
    age = "100.00"; 
    name = cody; 
}, 
    { 
    age = "28.00"; 
    name = sam; 
}, 
    { 
    age = "299.00"; 
    name = marvin; 
}, 
    { 
    age = "54.00"; 
    name = tammy; 
} 

)

आप इसे तरह यह है, लेकिन मेरी समझ से यह स्ट्रिंग द्वारा छँटाई है करता है देख सकते हैं। मैंने कोशिश की है लेकिन एक विधि लिखने की कोशिश करने में विफल होने के कुछ दिनों बाद जो मेरे लिए यह सॉर्ट करेगा, अभी भी नुकसान में है। सबसे अच्छा तरीका क्या होगा और इसे पूरा करने के लिए यह एक संख्यात्मक मूल्य से टाइप करता है?

+0

क्यों नहीं क्या आप उम्र को संख्या के रूप में स्टोर नहीं करते? [एनएसएनंबर संख्या विथफ्लैट: 28.0 एफ]; – Gobra

+0

क्योंकि जेएसओएन का उपयोग कर वास्तविक स्क्रिप्ट के साथ काम किया जाता है, इसलिए यह एक स्ट्रिंग ऑब्जेक्ट के रूप में आता है अन्यथा मैं :) :) – cdnicoll

उत्तर

10

हालांकि मैं यहां तार के उपयोग के सवाल, सबसे आसान तरीका हो साथ कि डेटा के साथ काम करने के लिए:

[array sortedArrayUsingComparator:^(NSDictionary *item1, NSDictionary *item2) { 
    NSString *age1 = [item1 objectForKey:@"age"]; 
    NSString *age2 = [item2 objectForKey:@"age"]; 
    return [age1 compare:age2 options:NSNumericSearch]; 
}]; 

या, ऑब्जेक्टिव-सी की अधिक हाल ही में subscripting सुविधाओं का उपयोग:

[array sortedArrayUsingComparator:^(NSDictionary *item1, NSDictionary *item2) { 
    return [item1[@"age"] compare:item2[@"age"] options:NSNumericSearch]; 
}]; 
+0

मुझे इसे एक स्पर्श को संशोधित करना पड़ा लेकिन यह काम किया, धन्यवाद! – cdnicoll

0

सबसे आसान उम्र को स्ट्रिंग के बजाय संख्या के रूप में संग्रहीत करेगा।

+0

मेरी उपरोक्त टिप्पणी देखें। यह एक JSON ऑब्जेक्ट के रूप में आ रहा है, इसलिए मैं इसे वास्तव में एक int मान नहीं बना सकता। – cdnicoll