NSMutableArray를 커스텀 객체로 어떻게 정렬합니까?


1268

내가하고 싶은 것은 매우 간단 해 보이지만 웹에서 답을 찾을 수 없습니다. 나는이 NSMutableArray오브젝트를, 그리고의 그들이 '사람'개체입니다 가정 해 봅시다. NSMutableArrayPerson.birthDate 로 정렬하고 싶습니다 NSDate.

이 방법과 관련이 있다고 생각합니다.

NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(???)];

Java에서 객체를 Comparable로 구현하거나 인라인 사용자 정의 비교기와 함께 Collections.sort를 사용합니다 ... 어떻게 Objective-C 에서이 작업을 수행합니까?

답변:


2299

방법 비교

객체에 대해 비교 방법을 구현하십시오.

- (NSComparisonResult)compare:(Person *)otherObject {
    return [self.birthDate compare:otherObject.birthDate];
}

NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(compare:)];

NSSortDescriptor (더 나은)

또는 일반적으로 더 나은 :

NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate"
                                           ascending:YES];
NSArray *sortedArray = [drinkDetails sortedArrayUsingDescriptors:@[sortDescriptor]];

배열에 둘 이상을 추가하여 여러 키로 쉽게 정렬 할 수 있습니다. 맞춤형 비교기 방법을 사용할 수도 있습니다. 설명서를 살펴보십시오 .

블록 (반짝!)

Mac OS X 10.6 및 iOS 4부터 블록으로 정렬 할 수도 있습니다.

NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
    NSDate *first = [(Person*)a birthDate];
    NSDate *second = [(Person*)b birthDate];
    return [first compare:second];
}];

공연

-compare:블록 기반 방법은 사용하지 않고, 상당히 빠른 일반적 것이다 NSSortDescriptor후자 KVC에 의존한다. 이 NSSortDescriptor방법 의 주요 장점은 코드가 아닌 데이터를 사용하여 정렬 순서를 정의 할 수있는 방법을 제공하므로 사용자가 NSTableView헤더 행을 클릭하여 정렬 할 수 있도록 설정 등을 쉽게 할 수 있다는 것 입니다.


66
첫 번째 예제에는 버그가 있습니다. birthDate 변수가 아니라 한 객체의 birthDate 인스턴스 변수를 다른 객체 자체와 비교합니다.
Martin Gjaldbaek

90
@ 마틴 : 감사합니다! 내가 그것에 대해 75 upvotes를 얻기 전에 아무도 눈치 채지 못한 것이 재미있다.
Georg Schölly

76
이것은 정답이며 따라서 대부분의 사용자가 결정적인 것으로 간주하기 때문에 블록 기반의 세 번째 예를 추가하면 사용자도 그 사실을 알 수 있습니다.
jpswain

6
@ orange80 : 나는 그것을 시도했다. 나는 더 이상 Mac을 소유하지 않으므로 코드를 볼 수 있다면 좋을 것입니다.
Georg Schölly

11
당신은 NSMutableArray내가 방법을 사용하는 것을 선호하는 경우 sortUsingDescriptors, sortUsingFunction또는 sortUsingSelector. 배열이 변경 가능한 한 일반적으로 정렬 된 사본이 필요하지 않습니다.
Stephan

109

NSMutableArray방법을 참조하십시오sortUsingFunction:context:

두 개의 객체 ( 두 개의 객체를 비교하고 있기 때문에 유형 )와 컨텍스트 매개 변수 를 취하는 비교 함수 를 설정해야합니다 .PersonPerson

두 개체는 단지 인스턴스입니다 Person. 세 번째 객체는 문자열입니다 (예 : @ "birthDate").

이 함수는 NSComparisonResult다음을 반환 NSOrderedAscending합니다 . PersonA.birthDate< 이면 반환 합니다 PersonB.birthDate. > NSOrderedDescending이면 반환 됩니다 . 마지막으로 == 이면 반환 합니다 .PersonA.birthDatePersonB.birthDateNSOrderedSamePersonA.birthDatePersonB.birthDate

이것은 거친 의사 코드입니다. 한 날짜가 다른 날짜와 "더 적다", "더 많음"또는 "같다"는 의미 (예 : 초-에포크 등 비교)를 살살 빼야합니다.

NSComparisonResult compare(Person *firstPerson, Person *secondPerson, void *context) {
  if ([firstPerson birthDate] < [secondPerson birthDate])
    return NSOrderedAscending;
  else if ([firstPerson birthDate] > [secondPerson birthDate])
    return NSOrderedDescending;
  else 
    return NSOrderedSame;
}

더 컴팩트 한 것을 원하면 삼항 연산자를 사용할 수 있습니다.

NSComparisonResult compare(Person *firstPerson, Person *secondPerson, void *context) {
  return ([firstPerson birthDate] < [secondPerson birthDate]) ? NSOrderedAscending : ([firstPerson birthDate] > [secondPerson birthDate]) ? NSOrderedDescending : NSOrderedSame;
}

이 작업을 많이하면 인라이닝이 속도를 약간 높일 수 있습니다.


9
sortUsingFunction : context :를 사용하는 것이 아마도 가장 c-ish적인 방법이며 가장 읽기 어려운 방법 일 것입니다.
Georg Schölly

12
실제로 아무런 문제가 없지만 지금은 더 나은 대안이 있다고 생각합니다.
Georg Schölly

6
아마도,하지만 나는 자바의 추상 Comparator 클래스와 비슷한 것을 찾고있는 Java 배경의 누군가가 덜 읽을 수 있다고 생각하지 않습니다. 비교 (Type obj1, Type obj2).
Alex Reynolds

5
비판에 기술적 인 장점이 거의없는 경우에도 여러분 중 몇 명이이 완벽하게 훌륭한 답변을 비판 할 이유를 찾고 있다는 느낌을받습니다. 기묘한.
Alex Reynolds

1
@Yar : 첫 번째 단락에서 제공 한 솔루션을 사용하거나 여러 정렬 설명자를 사용할 수 있습니다. sortedArrayUsingDescriptors : 정렬 디스크립터 배열을 인수로 사용합니다.
Georg Schölly

62

iOS 4에서 블록을 사용 하여이 작업을 수행했습니다. 배열의 요소를 id에서 클래스 유형으로 캐스팅해야했습니다. 이 경우 점수라는 속성이있는 점수라는 클래스입니다.

또한 배열의 요소가 올바른 유형이 아닌 경우 수행 할 작업을 결정해야합니다.이 예제에서는 방금 반환 NSOrderedSame했지만 코드에서는 예외이지만 예외입니다.

NSArray *sorted = [_scores sortedArrayUsingComparator:^(id obj1, id obj2){
    if ([obj1 isKindOfClass:[Score class]] && [obj2 isKindOfClass:[Score class]]) {
        Score *s1 = obj1;
        Score *s2 = obj2;

        if (s1.points > s2.points) {
            return (NSComparisonResult)NSOrderedAscending;
        } else if (s1.points < s2.points) {
            return (NSComparisonResult)NSOrderedDescending;
        }
    }

    // TODO: default is the same?
    return (NSComparisonResult)NSOrderedSame;
}];

return sorted;

추신 : 이것은 내림차순으로 정렬됩니다.


6
실제로 "(Score *)"캐스트가 필요하지 않습니다. "Score * s1 = obj1;" ID가 행복하게 컴파일러 :-)에서 경고없이 아무것도 캐스팅 때문에
jpswain

right orange80 downcasting은 weak 변수 전에 캐스트가 필요하지 않습니다.
thesummersign

기본 최종 반환 될 수 있도록, 상단 또는 지속적으로 아래로 전무 비교하지-전무를 정렬해야return ((!obj1 && !obj2) ? NSOrderedSame : (obj1 ? NSOrderedAscending : NSOrderedDescending))
스콧 Corscadden

크리스, 나는이 코드를 시도, 내 프로그램에서 hv를 새로 고칩니다 .. 처음으로 올바른 작업을 수행하고 내림차순 출력을 얻었습니다. 순서는 내림차순이 아닙니다. 내 배열의 4 hv 객체, 3 hv 동일한 데이터, 1이 다르다고 가정 해보십시오.
Nikesh K

실제로 "점수"클래스가 아닌 개체를 예상하면 좀 더주의해서 정렬해야합니다. 그렇지 않으면 other == score1 <score2 == other가 일치하지 않아 문제가 발생할 수 있습니다. 스코어 객체가 다른 모든 객체보다 먼저 정렬되고 다른 모든 객체가 서로 동일하게 정렬됨을 의미하는 값을 반환 할 수 있습니다.
gnasher729

29

iOS 4부터는 정렬을 위해 블록을 사용할 수도 있습니다.

이 특정 예제에서는 배열의 객체에 'position'메서드가 있다고 가정합니다 NSInteger.

NSArray *arrayToSort = where ever you get the array from... ;
NSComparisonResult (^sortBlock)(id, id) = ^(id obj1, id obj2) 
{
    if ([obj1 position] > [obj2 position]) 
    { 
        return (NSComparisonResult)NSOrderedDescending;
    }
    if ([obj1 position] < [obj2 position]) 
    {
        return (NSComparisonResult)NSOrderedAscending;
    }
    return (NSComparisonResult)NSOrderedSame;
};
NSArray *sorted = [arrayToSort sortedArrayUsingComparator:sortBlock];

참고 : "정렬 된"배열은 자동 해제됩니다.


26

나는 모든 것을 시도했지만 이것은 나를 위해 일했다. 클래스에 " crimeScene"(이) 라는 또 다른 클래스가 있으며 " "의 속성으로 정렬하려고합니다 crimeScene.

이것은 매력처럼 작동합니다.

NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"crimeScene.distance" ascending:YES];
[self.arrAnnotations sortUsingDescriptors:[NSArray arrayWithObject:sorter]];

21

Georg Schölly의 두 번째 대답 에는 빠진 단계가 있지만 제대로 작동합니다.

NSSortDescriptor *sortDescriptor;
sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"birthDate"
                                              ascending:YES] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingDescriptors:sortDescriptors];

// 복사하여 붙여 넣을 때 시간이 낭비되고 sortedArrayUsingDescriptors에서 's'없이 실패했기 때문에 's'를 추가했습니다.


메소드 호출은 실제로 "sortedArrayUsingDescriptors :"이며 끝에 's'가 있습니다.
CIFilter

19
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"birthDate" ascending:YES] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingDescriptors:sortDescriptors];

고마워요, 잘 작동합니다 ...


17

귀하의 Person개체는 방법을 구현해야 말을 compare:다른 걸립니다 Person개체를 반환NSComparisonResult 2 객체 사이의 관계에 따라.

그럼 당신은 부를 것이다 sortedArrayUsingSelector:함께@selector(compare:) 하며 수행해야합니다.

다른 방법이 있지만 내가 아는 한 Comparable인터페이스 의 Cocoa-equiv는 없습니다 . 사용하는 sortedArrayUsingSelector:것이 가장 고통스럽지 않은 방법 일 것입니다.


9

iOS 4 블록은 당신을 구할 것입니다 :)

featuresArray = [[unsortedFeaturesArray sortedArrayUsingComparator: ^(id a, id b)  
{
    DMSeatFeature *first = ( DMSeatFeature* ) a;
    DMSeatFeature *second = ( DMSeatFeature* ) b;

    if ( first.quality == second.quality )
        return NSOrderedSame;
    else
    {
        if ( eSeatQualityGreen  == m_seatQuality || eSeatQualityYellowGreen == m_seatQuality || eSeatQualityDefault  == m_seatQuality )
        {
            if ( first.quality < second.quality )
                return NSOrderedAscending;
            else
                return NSOrderedDescending;
        }
        else // eSeatQualityRed || eSeatQualityYellow
        {
            if ( first.quality > second.quality )
                return NSOrderedAscending;
            else
                return NSOrderedDescending;
        } 
    }
}] retain];

http://sokol8.blogspot.com/2011/04/sorting-nsarray-with-blocks.html 약간의 설명


8

의 경우 방법을 NSMutableArray사용하십시오 sortUsingSelector. 새 인스턴스를 만들지 않고 제자리에 정렬합니다.


그냥 업데이트 : 나도 변경 가능한 배열을 정렬 한 것을 찾고 있었지만 iOS 7의 모든 "sortedArrayUsing"메소드에 대해 "sortUsing"과 동등한 메소드가 sortUsingComparator:있습니다.
jmathew

7

목적에 따라 다음과 같은 일반적인 방법을 사용할 수 있습니다. 문제를 해결해야합니다.

//Called method
-(NSMutableArray*)sortArrayList:(NSMutableArray*)arrDeviceList filterKeyName:(NSString*)sortKeyName ascending:(BOOL)isAscending{
    NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:sortKeyName ascending:isAscending];
    [arrDeviceList sortUsingDescriptors:[NSArray arrayWithObject:sorter]];
    return arrDeviceList;
}

//Calling method
[self sortArrayList:arrSomeList filterKeyName:@"anything like date,name etc" ascending:YES];

6

의 배열을 정렬하는 경우 한 번의 NSNumbers호출로 정렬 할 수 있습니다.

[arrayToSort sortUsingSelector: @selector(compare:)];

배열의 객체 ( NSNumber객체)가 비교 메소드를 구현 하기 때문에 작동합니다 . NSString객체 또는 비교 메소드를 구현하는 사용자 정의 데이터 객체 배열에 대해서도 동일한 작업을 수행 할 수 있습니다.

다음은 비교기 블록을 사용하는 예제 코드입니다. 각 사전이 키 "sort_key"에 숫자를 포함하는 사전 배열을 정렬합니다.

#define SORT_KEY @\"sort_key\"

[anArray sortUsingComparator: 
 ^(id obj1, id obj2) 
  {
  NSInteger value1 = [[obj1 objectForKey: SORT_KEY] intValue];
  NSInteger value2 = [[obj2 objectForKey: SORT_KEY] intValue];
  if (value1 > value2) 
{
  return (NSComparisonResult)NSOrderedDescending;
  }

  if (value1 < value2) 
{
  return (NSComparisonResult)NSOrderedAscending;
  }
    return (NSComparisonResult)NSOrderedSame;
 }];

위의 코드는 각 정렬 키에 대해 정수 값을 가져 와서이를 비교하는 방법을 설명하는 작업을 거칩니다. NSNumber객체는 비교 메소드를 구현 하므로 훨씬 간단하게 다시 작성할 수 있습니다.

 #define SORT_KEY @\"sort_key\"

[anArray sortUsingComparator: 
^(id obj1, id obj2) 
 {
  NSNumber* key1 = [obj1 objectForKey: SORT_KEY];
  NSNumber* key2 = [obj2 objectForKey: SORT_KEY];
  return [key1 compare: key2];
 }];

또는 비교기 본체를 한 줄로 증류 할 수도 있습니다.

  return [[obj1 objectForKey: SORT_KEY] compare: [obj2 objectForKey: SORT_KEY]];

코드를 읽기 쉽고 디버깅하기 쉽기 때문에 간단한 문장과 많은 임시 변수를 선호합니다. 컴파일러는 어쨌든 임시 변수를 최적화하여 올인원 버전의 이점이 없습니다.


5

Linq to ObjectiveC 라는 작은 범주 메서드 라이브러리를 만들었습니다 . 키 선택기와 함께 정렬 방법을 사용하면 birthDate다음과 같이 정렬 할 수 있습니다 .

NSArray* sortedByBirthDate = [input sort:^id(id person) {
    return [person birthDate];
}]

" LINQ to Objective-C "라고해야합니다.
피터 Mortensen

5

방금 사용자 정의 요구 사항에 따라 다중 수준 정렬을 수행했습니다.

// 값 정렬

    [arrItem sortUsingComparator:^NSComparisonResult (id a, id b){

    ItemDetail * itemA = (ItemDetail*)a;
    ItemDetail* itemB =(ItemDetail*)b;

    //item price are same
    if (itemA.m_price.m_selling== itemB.m_price.m_selling) {

        NSComparisonResult result=  [itemA.m_itemName compare:itemB.m_itemName];

        //if item names are same, then monogramminginfo has to come before the non monograme item
        if (result==NSOrderedSame) {

            if (itemA.m_monogrammingInfo) {
                return NSOrderedAscending;
            }else{
                return NSOrderedDescending;
            }
        }
        return result;
    }

    //asscending order
    return itemA.m_price.m_selling > itemB.m_price.m_selling;
}];

https://sites.google.com/site/greateindiaclub/mobil-apps/ios/multilevelsortinginiosobjectivec


5

내 프로젝트 중 일부에서 sortUsingFunction :: 을 사용 했습니다.

int SortPlays(id a, id b, void* context)
{
    Play* p1 = a;
    Play* p2 = b;
    if (p1.score<p2.score) 
        return NSOrderedDescending;
    else if (p1.score>p2.score) 
        return NSOrderedAscending;
    return NSOrderedSame;
}

...
[validPlays sortUsingFunction:SortPlays context:nil];

5

NSSortDescriptor를 사용하여 NSMutableArray를 사용자 정의 객체로 정렬

 NSSortDescriptor *sortingDescriptor;
 sortingDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate"
                                       ascending:YES];
 NSArray *sortArray = [drinkDetails sortedArrayUsingDescriptors:@[sortDescriptor]];

4
-(NSMutableArray*) sortArray:(NSMutableArray *)toBeSorted 
{
  NSArray *sortedArray;
  sortedArray = [toBeSorted sortedArrayUsingComparator:^NSComparisonResult(id a, id b) 
  {
    return [a compare:b];
 }];
 return [sortedArray mutableCopy];
}

새로운 배열이 반환 될 때 가변 배열을 전달 해야하는 이유. 래퍼를 만드는 이유는 무엇입니까?
vikingosegundo

3

정렬 NSMutableArray은 매우 간단합니다.

NSMutableArray *arrayToFilter =
     [[NSMutableArray arrayWithObjects:@"Photoshop",
                                       @"Flex",
                                       @"AIR",
                                       @"Flash",
                                       @"Acrobat", nil] autorelease];

NSMutableArray *productsToRemove = [[NSMutableArray array] autorelease];

for (NSString *products in arrayToFilter) {
    if (fliterText &&
        [products rangeOfString:fliterText
                        options:NSLiteralSearch|NSCaseInsensitiveSearch].length == 0)

        [productsToRemove addObject:products];
}
[arrayToFilter removeObjectsInArray:productsToRemove];

2

NSComparator를 사용하여 정렬

사용자 정의 객체를 정렬하려면 사용자 정의 객체 NSComparator를 비교하는 데 사용되는을 제공해야 합니다. 블록은 NSComparisonResult두 객체의 순서를 나타내는 값을 반환 합니다. 따라서 전체 배열을 정렬하려면 NSComparator다음과 같은 방식으로 사용됩니다.

NSArray *sortedArray = [employeesArray sortedArrayUsingComparator:^NSComparisonResult(Employee *e1, Employee *e2){
    return [e1.firstname compare:e2.firstname];    
}];

NSSortDescriptor를 사용하여 정렬
예를 들어, 사용자 정의 클래스의 인스턴스를 포함하는 배열을 가지고 있다고 가정 합니다 . Employee에는 이름, 성 및 연령 속성이 있습니다. 다음 예제에서는 배열 키를 기준으로 오름차순으로 배열 내용을 정렬하는 데 사용할 수있는 NSSortDescriptor를 만드는 방법을 보여줍니다.

NSSortDescriptor *ageDescriptor = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
NSArray *sortDescriptors = @[ageDescriptor];
NSArray *sortedArray = [employeesArray sortedArrayUsingDescriptors:sortDescriptors];

사용자 지정 비교를 사용하여 정렬
이름은 문자열이며 사용자에게 제공 할 문자열을 정렬 할 때는 항상 지역화 된 비교를 사용해야합니다. 대소 문자를 구분하지 않는 비교를 수행하려는 경우가 종종 있습니다. 다음은 (localizedStandardCompare :)와 함께 성 및 이름으로 배열을 정렬하는 예제입니다.

NSSortDescriptor *lastNameDescriptor = [[NSSortDescriptor alloc]
              initWithKey:@"lastName" ascending:YES selector:@selector(localizedStandardCompare:)];
NSSortDescriptor * firstNameDescriptor = [[NSSortDescriptor alloc]
              initWithKey:@"firstName" ascending:YES selector:@selector(localizedStandardCompare:)];
NSArray *sortDescriptors = @[lastNameDescriptor, firstNameDescriptor];
NSArray *sortedArray = [employeesArray sortedArrayUsingDescriptors:sortDescriptors];

참조 및 자세한 논의는 https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/SortDescriptors/Articles/Creating.html http://www.ios-blog.co.uk/tutorials 를 참조하십시오.
/ objective-c / how-to-sort-nsarray-with-custom-objects /


1

Swift의 프로토콜과 함수형 프로그래밍을 사용하면 클래스를 Comparable 프로토콜과 일치시키고 프로토콜에 필요한 메소드를 구현 한 다음 sorted (by :) 고차 함수를 사용하여 사용할 필요없이 정렬 된 배열을 작성하기 만하면됩니다. 그런데 가변 배열.

class Person: Comparable {
    var birthDate: NSDate?
    let name: String

    init(name: String) {
        self.name = name
    }

    static func ==(lhs: Person, rhs: Person) -> Bool {
        return lhs.birthDate === rhs.birthDate || lhs.birthDate?.compare(rhs.birthDate as! Date) == .orderedSame
    }

    static func <(lhs: Person, rhs: Person) -> Bool {
        return lhs.birthDate?.compare(rhs.birthDate as! Date) == .orderedAscending
    }

    static func >(lhs: Person, rhs: Person) -> Bool {
        return lhs.birthDate?.compare(rhs.birthDate as! Date) == .orderedDescending
    }

}

let p1 = Person(name: "Sasha")
p1.birthDate = NSDate() 

let p2 = Person(name: "James")
p2.birthDate = NSDate()//he is older by miliseconds

if p1 == p2 {
    print("they are the same") //they are not
}

let persons = [p1, p2]

//sort the array based on who is older
let sortedPersons = persons.sorted(by: {$0 > $1})

//print sasha which is p1
print(persons.first?.name)
//print James which is the "older"
print(sortedPersons.first?.name)

1

제 경우에는 "sortedArrayUsingComparator"를 사용하여 배열을 정렬합니다. 아래 코드를보십시오.

contactArray = [[NSArray arrayWithArray:[contactSet allObjects]] sortedArrayUsingComparator:^NSComparisonResult(ContactListData *obj1, ContactListData *obj2) {
    NSString *obj1Str = [NSString stringWithFormat:@"%@ %@",obj1.contactName,obj1.contactSurname];
    NSString *obj2Str = [NSString stringWithFormat:@"%@ %@",obj2.contactName,obj2.contactSurname];
    return [obj1Str compare:obj2Str];
}];

또한 내 목표는

@interface ContactListData : JsonData
@property(nonatomic,strong) NSString * contactName;
@property(nonatomic,strong) NSString * contactSurname;
@property(nonatomic,strong) NSString * contactPhoneNumber;
@property(nonatomic) BOOL isSelected;
@end

1

sortDescriptor를 작성해야하며 아래와 같이 sortDescriptor를 사용하여 nsmutablearray를 정렬 할 수 있습니다.

 let sortDescriptor = NSSortDescriptor(key: "birthDate", ascending: true, selector: #selector(NSString.compare(_:)))
 let array = NSMutableArray(array: self.aryExist.sortedArray(using: [sortDescriptor]))
 print(array)

1

중첩 된 객체에 이와 같이 사용

NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastRoute.to.lastname" ascending:YES selector:@selector(caseInsensitiveCompare:)];
NSMutableArray *sortedPackages = [[NSMutableArray alloc]initWithArray:[packages sortedArrayUsingDescriptors:@[sortDescriptor]]];

lastRoute는 하나의 객체이며 해당 객체는 to 문자열을 보유하는 객체입니다.


0

스위프트에서 배열 정렬


들어 Swifty사람 아래 세계에 대한 목표 이상으로 달성하기 매우 깨끗한 기술이다. User몇 가지 속성을 가진 예제 커스텀 클래스를 보자.

class User: NSObject {
    var id: String?
    var name: String?
    var email: String?
    var createdDate: Date?
}

이제 createdDate오름차순 및 / 또는 내림차순으로 정렬해야하는 배열이 있습니다. 날짜 비교를위한 함수를 추가하자.

class User: NSObject {
    var id: String?
    var name: String?
    var email: String?
    var createdDate: Date?
    func checkForOrder(_ otherUser: User, _ order: ComparisonResult) -> Bool {
        if let myCreatedDate = self.createdDate, let othersCreatedDate = otherUser.createdDate {
            //This line will compare both date with the order that has been passed.
            return myCreatedDate.compare(othersCreatedDate) == order
        }
        return false
    }
}

지금이 수 extensionArray를 들어 User. 간단히 말해서 User객체 가있는 Array에만 메소드를 추가 할 수 있습니다 .

extension Array where Element: User {
    //This method only takes an order type. i.e ComparisonResult.orderedAscending
    func sortUserByDate(_ order: ComparisonResult) -> [User] {
        let sortedArray = self.sorted { (user1, user2) -> Bool in
            return user1.checkForOrder(user2, order)
        }
        return sortedArray
    }
}

오름차순 주문

let sortedArray = someArray.sortUserByDate(.orderedAscending)

내림차순의 사용법

let sortedArray = someArray.sortUserByDate(.orderedAscending)

동일한 주문에 대한 사용법

let sortedArray = someArray.sortUserByDate(.orderedSame)

위의 메소드는 || 유형 인 extension경우에만 액세스 할 수 있습니다.Array[User]Array<User>


0

스위프트 버전 : 5.1

사용자 정의 구조체 또는 클래스가 있고 임의로 정렬하려는 경우 지정한 필드에서 정렬하는 후행 클로저를 사용하여 sort ()를 호출해야합니다. 다음은 특정 속성을 기준으로 정렬하는 사용자 지정 구조체 배열을 사용하는 예입니다.

    struct User {
        var firstName: String
    }

    var users = [
        User(firstName: "Jemima"),
        User(firstName: "Peter"),
        User(firstName: "David"),
        User(firstName: "Kelly"),
        User(firstName: "Isabella")
    ]

    users.sort {
        $0.firstName < $1.firstName
    }

정렬 된 배열을 제자리에 정렬하지 않고 반환하려면 다음과 같이 sorted ()를 사용하십시오.

    let sortedUsers = users.sorted {
        $0.firstName < $1.firstName
    }

0
  let sortedUsers = users.sorted {
    $0.firstName < $1.firstName
 }

문제는있는 NSMutableArray에 대한,하지 스위프트의 배열 수집에 관한 것입니다
리카르도

-2
NSMutableArray *stockHoldingCompanies = [NSMutableArray arrayWithObjects:fortune1stock,fortune2stock,fortune3stock,fortune4stock,fortune5stock,fortune6stock , nil];

NSSortDescriptor *sortOrder = [NSSortDescriptor sortDescriptorWithKey:@"companyName" ascending:NO];

[stockHoldingCompanies sortUsingDescriptors:[NSArray arrayWithObject:sortOrder]];

NSEnumerator *enumerator = [stockHoldingCompanies objectEnumerator];

ForeignStockHolding *stockHoldingCompany;

NSLog(@"Fortune 6 companies sorted by Company Name");

    while (stockHoldingCompany = [enumerator nextObject]) {
        NSLog(@"===============================");
        NSLog(@"CompanyName:%@",stockHoldingCompany.companyName);
        NSLog(@"Purchase Share Price:%.2f",stockHoldingCompany.purchaseSharePrice);
        NSLog(@"Current Share Price: %.2f",stockHoldingCompany.currentSharePrice);
        NSLog(@"Number of Shares: %i",stockHoldingCompany.numberOfShares);
        NSLog(@"Cost in Dollars: %.2f",[stockHoldingCompany costInDollars]);
        NSLog(@"Value in Dollars : %.2f",[stockHoldingCompany valueInDollars]);
    }
    NSLog(@"===============================");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.