2010-01-15 6 views
10

두 개의 키로 정렬하려는 객체의 배열이 있습니다. 객체는 학생이고 내 정렬을 위해 intrested 인 속성은 등급이름이 인 것을 말합니다.두 개의 기준에 따라 객체 배열 정렬?

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

어떻게 개체를 먼저 등급순으로 정렬하고 이름순으로 정렬 할 수 있습니까? 그래서 예를 들어 내가 목록이있는 경우 : 톰를 9.9 앤드류 9.8 Chriestie 9.8 앨리슨 내가해야 정렬 후 10 에이다 9.8

10 매트 : 앨리슨 10 크리스티 (10) 톰 9.9 에이다 9.8 앤드류 9.8 매트 9.8

그리고하지 크리스티 (10) 앨리슨 10 톰 9.9 앤드류 9.8 Ada 9.8 매트 9.8

모든 포인터가 정말 도움이됩니다.

답변

22

가 내 목표 - C 지식에 꽤 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

내 의견으로는이 방법이 가장 쉽습니다. 정렬 설명자를 사용하여 정렬하면 모든 수준의 계층 적 정렬을 수행 할 수 있습니다. 즉, 모든 객체가 제 1 정렬 디스크립터에 따라 정렬되고, 임의의 나머지 복제가 제 2의 제 3 디스크립터에 따라 정렬되는 등이다. 원하는 경우 정렬 설명자를 사용하기위한 구문을 통합하는 데 도움이되는 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]; 
관련 문제