Development Tip

NSSet을 정렬하는 가장 효율적인 방법은 무엇입니까?

yourdevel 2020. 11. 23. 20:17
반응형

NSSet을 정렬하는 가장 효율적인 방법은 무엇입니까?


세트의 객체 속성을 기반으로 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 개의 비교가 필요합니다.

Cocoa 자체는 컬렉션을 정렬 된 순서로 유지하는 효율적인 접근 방식을 제공하지 않습니다. Java에는 객체가 삽입되거나 제거 될 때마다 정렬 된 순서로 요소를 유지 하는 TreeSet 클래스가 있지만 Cocoa는 그렇지 않습니다. 바로이 문제로 인해 제 자신의 용도로 비슷한 것을 개발하게되었습니다.

상속하고 개선 한 데이터 구조 프레임 워크의 일부로 정렬 된 집합에 대한 프로토콜과 몇 가지 구현을 만들었습니다 . 구체적인 하위 클래스는 정렬 된 순서로 고유 한 개체 집합을 유지합니다. 아직 수정해야 할 사항이 있습니다. 가장 중요한 것은 -compare :( 세트의 각 객체가 구현해야 함)의 결과에 따라 정렬하고 아직 NSSortDescriptor를 허용하지 않는 것입니다. (해결 방법은 -compare :를 구현하여 객체에 대한 관심 속성을 비교하는 것입니다.)

한 가지 가능한 단점은 이러한 클래스가 (현재) NS (Mutable) Set의 하위 클래스가 아니므로 NSSet을 전달해야하는 경우 순서가 지정되지 않는다는 것입니다. (프로토콜에는 NSSet을 반환하는 -set 메소드가 있습니다. 물론 순서가 없습니다.) 프레임 워크에서 NSMutableDictionary 하위 클래스를 사용하여 수행 한 것처럼 곧 수정할 계획입니다. 피드백은 확실히 환영합니다. :-)


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


NSSet은 정렬되지 않은 개체의 모음입니다. 애플 레퍼런스 살펴보기 배열은 정렬 된 컬렉션입니다.

NSArray를 살펴보면 http://developer.apple.com/documentation/Cocoa/Conceptual/Collections/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];

You can't sort NSSet, because "sortedArrayUsingFunction:" set result as NSArray... And all upper hint work with only Array :)

NSArray *myArray = [mySet sortedArrayUsingDescriptors:descriptors];

Work perfect, and not need other way :)


Since OS X 10.7 and iOS 5.0 there's NSOrderedSet. You can use it to keep objects in set and keep their order. NSMutableOrderedSet has methods for sorting. In some situations this may give a performance improvement, since you don't have to create separate object like NSArray to store sorted items.

참고URL : https://stackoverflow.com/questions/1066829/what-is-the-most-efficient-way-to-sort-an-nsset

반응형