2010-01-15 74 views
10

Tôi có một mảng đối tượng mà tôi muốn sắp xếp theo hai khóa. Các đối tượng cho phép nói là loại Sinh viên và các thuộc tính mà tôi bị xâm nhập theo loại của tôi là lớptên.Sắp xếp mảng đối tượng theo hai tiêu chí?

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

Làm cách nào để sắp xếp các đối tượng đầu tiên theo cấp lớp và sau đó là tên? ví dụ như vậy nếu tôi có danh sách: Tom 9,9 Andrew 9,8 Chriestie 10 Mat 9,8 Allison 10 Ada 9,8

Sau khi loại tôi cần phải có: Allison 10 Christie 10 Tom 9,9 Ada 9.8 Andrew 9,8 Mat 9,8

Và không Christie 10 Allison 10 Tom 9,9 Andrew 9,8 Ada 9.8 Mat 9.8

bất kỳ con trỏ nào thực sự hữu ích.

Trả lời

22

Tôi khá flakey trên kiến ​​thức khách quan-c của tôi, nhưng có một số gợi ý tốt here và luôn có số documentation. Đây là vết nứt của tôi ở đó ...

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

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

Đây là cách dễ nhất để làm điều đó theo ý kiến ​​của tôi. Sắp xếp bằng cách sử dụng các bộ mô tả sắp xếp cho phép bạn đạt được bất kỳ cấp phân loại phân cấp nào. tức là, tất cả các đối tượng được sắp xếp theo bộ mô tả sắp xếp đầu tiên, mọi bản sao còn lại được sắp xếp theo bộ mô tả thứ ba thứ hai, v.v. Nếu bạn muốn, hãy xem http://github.com/LucasTizma/spot_trot_helpers#nsarray+stadditions cho danh mục của tôi trên 'NSArray' (' NSArray + STAdditions') giúp củng cố cú pháp cho việc sử dụng các bộ mô tả sắp xếp. – LucasTizma

3

Bạn về cơ bản cần phải thực hiện so sánh của riêng bạn và sử dụng một trong NSArray phương pháp loại (ví dụ 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

tôi sẽ thử nó. cảm ơn bạn! –

0

_pScheduleArr: Tên mảng trong mã bên dưới của tôi. Mảng này chứa đối tượng mô hình tùy chỉnh. Tôi so sánh mảng thay mặt cho ngày tháng và thứ tự bảng chữ cái. Ngày cũng có mặt trong mảng bên trong mảng (mô hình dữ liệu lõi).

_pScheduleArr = [[_pScheduleArr sortedArrayUsingComparator:^NSComparisonResult (Họp * obj1, Họp * 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]; 
Các vấn đề liên quan