문제

물체를 정렬하는 가장 효율적인 방법은 무엇입니까? NSSet/NSMutableSet 세트의 객체의 속성을 기반으로? 지금 내가하고있는 방식은 각 객체를 반복하는 것입니다. NSMutableArray, 그리고 그 배열을 함께 정렬하십시오 NSSortDescriptor.

도움이 되었습니까?

해결책

사용해보십시오

[[mySet allObjects] sortedArrayUsingDescriptors:descriptors];

편집하다: iOS ≥ 4.0 및 Mac OS X ≥ 10.6의 경우 직접 사용할 수 있습니다.

[mySet sortedArrayUsingDescriptors:descriptors];

다른 팁

객체 세트를 정렬하는 "가장 효율적인 방법"은 실제로 의미하는 바에 따라 다릅니다. 캐주얼 가정 (이전 답변이 만든)은 세트의 일회성 객체입니다. 이 경우, 나는 그것이 무엇 사이의 토스 업이라고 말하고 싶습니다. @cobbal 제안과 당신이 생각해 낸 것 - 아마도 다음과 같은 것 :

NSMutableArray* array = [NSMutableArray arrayWithCapacity:[set count]];
for (id anObject in set)
    [array addObject:anObject];
[array sortUsingDescriptors:descriptors];

( @Cobbal의 접근 방식이 두 개의 자동 저리 배열을 생성하므로 메모리 풋 프린트가 두 배가되기 때문에 토스 업이라고 말합니다. 이것은 작은 객체 세트의 경우 중요하지 않지만 기술적으로는 접근 방식이 매우 효율적이지 않습니다.)

하지만, 세트의 요소를 두 번 이상 정렬하는 경우 (특히 규칙적인 경우) 이것은 확실히 효율적인 접근법이 아닙니다. nsmutablearray를 유지하고 nsset과 동기화 한 다음 호출 -sortusingdescriptors를 호출 할 수 있습니다. 매번 배열이 이미 정렬 되더라도 여전히 n 비교가 필요합니다.

코코아 자체는 정렬 된 순서로 컬렉션을 유지하기위한 효율적인 접근 방식을 제공하지 않습니다. Java에는 a 트리 셋 객체를 삽입하거나 제거 할 때마다 요소를 정렬 순서로 유지하는 클래스이지만 코코아는 그렇지 않습니다. 이 문제는 저의 사용과 비슷한 것을 개발하게 된 것은 바로이 문제였습니다.

데이터 구조 프레임 워크의 일부로 상속 받고 개조 한 후 정렬 된 세트에 대한 프로토콜 및 몇 가지 구현. 콘크리트 서브 클래스 중 하나는 정렬 된 순서로 별개의 객체 세트를 유지합니다. 아직 개선 할 수있는 개선이 있습니다. 가장 중요한 것은 -compare의 결과를 기반으로 분류하는 것입니다. (해결 방법은 -Compare를 구현하는 것입니다 : 개체의 관심 속성을 비교하는 것입니다.)

가능한 단점 중 하나는 이러한 클래스가 (현재) NS (Mutable) 세트의 하위 클래스가 아니므로 NSSEST를 통과 해야하는 경우 주문되지 않습니다. (프로토콜에는 NSSET을 반환하는 -세트 메소드가 있습니다. 물론 변하지 않습니다.) 프레임 워크에서 NSMutabledictionary 서브 클래스를 사용했을 때 곧이를 수정할 계획입니다. 피드백은 확실히 환영합니다. :-)

iOS ≥ 5.0 및 Mac OS X ≥ 10.7의 경우 직접 사용할 수 있습니다. NSOrderedSet

NSSET은 정렬되지 않은 객체의 모음입니다. Apple 참조 배열을 보는 것은 주문 된 컬렉션입니다.

nsarray를보고http://developer.apple.com/documentation/cocoa/conceptual/collession/articles/sortingfilteringarrays ...

링크의 예 :

NSInteger alphabeticSort(id string1, id string2, void *reverse)
{
    if (*(BOOL *)reverse == YES) {
        return [string2 localizedCaseInsensitiveCompare:string1];
    }
    return [string1 localizedCaseInsensitiveCompare:string2];
}

// assuming anArray is array of unsorted strings

NSArray *sortedArray;

// sort using a selector
sortedArray =
    [anArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

// sort using a function
BOOL reverseSort = NO;
sortedArray =
    [anArray sortedArrayUsingFunction:alphabeticSort context:&reverseSort];

"SortedArrayusingFunction :"결과를 nsarray로 설정하고 모든 상단 힌트는 배열만으로 작동하기 때문에 nsset을 정렬 할 수 없습니다. :)

NSArray *myArray = [mySet sortedArrayUsingDescriptors:descriptors];

완벽하게 일하고 다른 방법이 필요하지 않습니다 :)

OS X 10.7 및 iOS 5.0 이후 NSOrderedSet. 객체를 세트로 유지하고 주문을 유지하는 데 사용할 수 있습니다. NSMutableOrderedSet 정렬 방법이 있습니다. 어떤 상황에서는 이와 같이 별도의 개체를 만들 필요가 없기 때문에 성능 향상을 줄 수 있습니다. NSArray 정렬 된 항목을 저장합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top