2011-06-03 12 views
18

मेरे पास एक शब्दकोश का एक सरणी है जिसे सॉर्ट किया गया हैअरेयूउंगिंग कॉम्पैटर उन्हें कुंजी के आधार पर टाइप करता है;sortedArrayUsingComparator int

listPerc = [listItem sortedArrayUsingComparator: ^(id a, id b) { 
    NSString *first = [a objectForKey:@"perc"]; 
    NSString *second = [b objectForKey:@"perc"]; 
    return [first compare:second]; 

समस्या यह है कि इस कुंजी एक संख्या है, और आदेश उदाहरण के लिए इतना है: 1,10, 15, 17, 2, 23, आदि यह संख्या की भयावहता की गणना नहीं करता है। मैं कैसे कर सकता हूं?

उत्तर

4

उन्हें NSNumber वस्तुओं में बनाने और उन के बजाय की तुलना करें। या तो उन्हें (पसंदीदा विधि) से शुरू करने के लिए NSNumbers के रूप में स्टोर करें या तुलना करें (धीमे) की तुलना करते समय उन्हें परिवर्तित करें।

एक NSNumber के लिए एक NSString परिवर्तित साथ किया जा सकता:

NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; 
[f setNumberStyle:NSNumberFormatterDecimalStyle]; 
NSNumber * myNumber = [f numberFromString:string]; 
[f release]; 
+0

बढ़िया! आपका बहुत बहुत धन्यवाद! – Vins

18

तुम वापस नहीं कर सकते तुलना इस तरह परिणाम,

listPerc = [listItem sortedArrayUsingComparator: ^(id a, id b) { 
    int first = [[a objectForKey:@"perc"] intValue]; 
    int second = [[b objectForKey:@"perc"] intValue]; 

    if (first < second) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } else if (first > second) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } else { 
     return (NSComparisonResult)NSOrderedSame; 
    } 
} 
+0

इस तरह से त्रुटियां हैं, धन्यवाद – Vins

+0

@ विन्स मुझे यकीन है कि मुझे कुछ याद आया। क्या आप मुझे बता सकते हैं कि ये त्रुटियां क्या हैं? –

+0

पहली पंक्ति 'असंगत ब्लॉक पॉइंटर प्रकार' आईडी (^) (आईडी, आईडी) 'प्रकार' एनएससीओम्परेटर '(उर्फ' एनएससीओम्परिसन रीसेट (^) (आईडी, आईडी) 'के पैरामीटर को भेजने के लिए' – Vins

0

शायद तुम कुछ इस तरह कर सकते हैं।

- (void)setPlaces:(NSArray *)places 
{ 
    if(_places != places) 
    { 
     _places = [places sortedArrayUsingComparator:^(id obj1, id obj2){ 
      return [[obj1 objectForKey:FLICKR_PLACE_NAME] caseInsensitiveCompare:[obj2 objectForKey:FLICKR_PLACE_NAME]]; 
     }]; 
     [self.tableView reloadData]; 
    } 
} 

मैं कुछ है कि तुम्हारा और ऊपर के बीच एक क्रॉस था और यह काम करता है: @ (दीपक Danduprolu) के जवाब का

- (void)setPlaces:(NSArray *)places 
{ 
    if(_places != places) 
    { 
     _places = [places sortedArrayUsingComparator:^(id a, id b){ 
       NSString *first = [a objectForKey:FLICKR_PLACE_NAME]; 
       NSString *second = [b objectForKey:FLICKR_PLACE_NAME]; 
       return [first caseInsensitiveCompare:second]; 
     } 
      ]; 
     if (self.tableView.window) [self.tableView reloadData]; 
    } //if _places 
} //set 
7

एक बहुत ही कम रास्ता

listPerc = [listItem sortedArrayUsingComparator: ^(id a, id b) { 
    NSNumber *first = @([[a objectForKey:@"perc"] intValue]); 
    NSNumber *second = @([[b objectForKey:@"perc"] intValue]); 
    return [first compare:second]; 

}

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