2010-01-15 22 views
10

मेरे पास ऑब्जेक्ट्स की एक सरणी है जिसे मैं दो चाबियों से सॉर्ट करना चाहता हूं। ऑब्जेक्ट्स का कहना है कि छात्र और मेरे गुणों के लिए जिन गुणों में मैं घुसपैठ कर रहा हूं वे ग्रेड और नाम हैं।दो मानदंडों से वस्तुओं की सरणी सरणी?

Student 
{ 
    double grade; 
    string name; 
    ... 
} 

मैं ग्रेड द्वारा पहले और फिर नाम से वस्तुओं को कैसे क्रमबद्ध कर सकता हूं? तो उदाहरण के लिए मैं सूची है यदि: टॉम 9.9 एंड्रयू 9.8 Chriestie 10 चटाई 9.8 एलीसन 10 एडीए 9.8

प्रकार के बाद मैं होना चाहिए: एलीसन 10 क्रिस्टी 10 टॉम 9.9 एडीए 9.8 एंड्रयू 9.8 चटाई 9,8

और न क्रिस्टी 10 एलीसन 10 टॉम 9.9 एंड्रयू 9.8 +०१२३५१६४१०६१एडीए 9.8 मैट 9.8

कोई भी सूचक वास्तव में सहायक है।

उत्तर

22

मैं अपने उद्देश्य-सी ज्ञान पर बहुत flakey हूँ लेकिन वहाँ कुछ अच्छे संकेत here है उपयोग करने की आवश्यकता है और वहाँ हमेशा documentation। यहां मेरी दरार है ...

NSSortDescriptor *gradeSorter = [[NSSortDescriptor alloc] initWithKey:@"grade" ascending:YES]; 
NSSortDescriptor *nameSorter = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 

[personList sortUsingDescriptors:[NSArray arrayWithObjects:gradeSorter, nameSorter, nil]]; 
+0

यह मेरी राय में ऐसा करने का सबसे आसान तरीका है। सॉर्ट डिस्क्रिप्टर का उपयोग करके सॉर्टिंग आपको पदानुक्रमित सॉर्टिंग के किसी भी स्तर को प्राप्त करने की अनुमति देता है। यानी, सभी ऑब्जेक्ट्स को पहले सॉर्ट डिस्क्रिप्टर के अनुसार क्रमबद्ध किया जाता है, शेष शेष डुप्लीकेट दूसरे तीसरे डिस्क्रिप्टर के अनुसार क्रमबद्ध होते हैं, और इसी तरह। यदि आप चाहते हैं, तो 'NSArray' ('NSArray + STAdditions') पर मेरी श्रेणी के लिए http://github.com/LucasTizma/spot_trot_helpers#nsarray+stadditions देखें जो सॉर्ट डिस्क्रिप्टर का उपयोग करने के लिए वाक्यविन्यास को मजबूत करने में मदद करता है। – LucasTizma

3

आप मूल रूप से अपने खुद के तुलनित्र को लागू करने और NSArray तरह तरीकों में से एक (जैसे sortedArrayUsingSelector:)

-(NSComparisonResult)compare:(Student *)student { 
    // sort by name 
    int nameComp = [name compare:student.name]; 
    if (nameComp != NSOrderedSame) return nameComp; 

    // reverse ordered as desired in the question 
    if (grade > student.grade) 
    return NSOrderedAscending; 
    else if (grade == student.grade) // watchout here 
    return NSOrderedSame; 
    else 
    return NSOrderedDescending; 
} 

NSArray *unsrtedArray = ... 
NSArray *sortedArray = [unsortedArray sortedArrayUsingSelector:@selector(compare:)]; 
+0

मैं इसे की कोशिश करेंगे। धन्यवाद! –

0

_pScheduleArr: मेरे नीचे दिए गए कोड में सरणी का नाम। इस सरणी में कस्टम मॉडल ऑब्जेक्ट है। मैं तिथि और वर्णमाला क्रम की ओर से सरणी की तुलना करता हूं। सरणी (कोर डेटा मॉडल) के अंदर सरणी में भी तारीख मौजूद है।

_pScheduleArr = [[_pScheduleArr sortedArrayUsingComparator:^NSComparisonResult (बैठकें * obj1, बैठक * obj2) {

NSOrderedSet *personSetObj1 = obj1.timeSlots; 
    Timeslot *tt1 = [[personSetObj1 array] objectAtIndex:0]; 
    NSOrderedSet *personSetObj2 = obj2.timeSlots; 
    Timeslot *tt2 = [[personSetObj2 array] objectAtIndex:0]; 
    NSDate *date11 = tt1.startTime; 
    NSDate *date12 = tt2.startTime; 

     NSComparisonResult comresult = [date11 compare:date12]; 
     if (comresult == NSOrderedSame) { 
      comresult = [obj1.title compare:obj2.title]; 
     } 
     return comresult; 

    }] mutableCopy]; 
संबंधित मुद्दे