2012-06-01 16 views
8

वस्तुओं मेरी Xcode प्रोजेक्ट में मैं निम्नलिखित श्रेणियां होती हैं:कस्टम के साथ क्रमबद्ध NSArray

पता

@interface LDAddress : NSObject{ 
    NSString *street; 
    NSString *zip; 
    NSString *city; 
    float latitude; 
    float longitude; 
} 

@property (nonatomic, retain) NSString *street; 
@property (nonatomic, retain) NSString *zip; 
@property (nonatomic, retain) NSString *city; 
@property (readwrite, assign, nonatomic) float latitude; 
@property (readwrite, assign, nonatomic) float longitude; 

@end 

स्थान

@interface LDLocation : NSObject{ 
    int locationId; 
    NSString *name; 
    LDAddress *address; 
} 
@property (readwrite, assign, nonatomic) int locationId; 
@property (nonatomic, retain) LDAddress *address; 
@property (nonatomic, retain) NSString *name; 

@end 

UITableViewController का एक उपवर्ग में, वहाँ है एक एनएसएआरएआरई जिसमें एलडीएलोकेशंस की कई अनगिनत वस्तुएं होती हैं। अब, मैं LDAddress की संपत्ति शहर पर आधारित NSArray की ऑब्जेक्ट्स को आरोही करना चाहता हूं।

मैं NSSortDescriptor का उपयोग करके सरणी को कैसे क्रमबद्ध कर सकता हूं? मैंने निम्नलिखित की कोशिश की, लेकिन सरणी को सॉर्ट करते समय ऐप डंप हो गया।

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Address.city" ascending:YES]; 
[_locations sortedArrayUsingDescriptors:@[sortDescriptor]]; 
+0

तुम सिर्फ कोशिश की @ "शहर" कुंजी के रूप में है? –

उत्तर

15

पहला कुंजी लोअरकेस बनाने का प्रयास करें।

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"address.city" ascending:YES]; 
+0

मैंने पूरी तरह से मेरे लिए काम किया =) धन्यवाद – PhilippS

14

तुम भी ब्लॉक के साथ एक सरणी सॉर्ट कर सकते हैं:

NSArray *sortedLocations = [_locations sortedArrayUsingComparator: ^(LDAddress *a1, LDAddress *a2) { 
     return [a1.city compare:a2.city]; 
    }]; 
+0

मुझे यह दृष्टिकोण सबसे अच्छा लगता है !!!! –

+0

मैंने आपके कोडिंग की कोशिश की और यह काम किया, लेकिन मुझे NSSortDescriptor के साथ एक सरणी सॉर्ट करना पसंद है। – PhilippS

+0

पूरी तरह से काम धन्यवाद ... –

3

यह कई प्रकार के साथ सॉर्ट करने के लिए अनुमति देगा। जैसा कि हमें समय के आधार पर मूवी को सॉर्ट करने की आवश्यकता है और यदि समय बराबर है तो नाम से सॉर्ट करने की आवश्यकता है।

NSArray *sortedArray = [childrenArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 
     NSNumber *first = [NSNumber numberWithLong:[(Movie*)a timeInMillis]]; 
     NSNumber *second = [NSNumber numberWithLong:[(Movie*)b timeInMillis]]; 
     NSComparisonResult result = [first compare:second]; 
     if(result == NSOrderedSame){ 
      result = [((NSString*)[(Movie*)a name]) compare:((NSString*)[(Movie*)b name])]; 
     } 
     return result; 
    }]; 
1
-(NSArray*)sortedWidgetList:(NSArray*)widgetList 
{ 
    NSSortDescriptor *firstDescriptor = [[NSSortDescriptor alloc] initWithKey:@"itemNum" ascending:YES]; 

    NSArray *sortDescriptors = [NSArray arrayWithObjects:firstDescriptor, nil]; 

    NSArray *sortedArray = [widgetList sortedArrayUsingDescriptors:sortDescriptors]; 

    return sortedArray; 
}