NSSET을 정렬하는 가장 효율적인 방법은 무엇입니까?
-
21-08-2019 - |
문제
물체를 정렬하는 가장 효율적인 방법은 무엇입니까? 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 참조 배열을 보는 것은 주문 된 컬렉션입니다.
링크의 예 :
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
정렬 된 항목을 저장합니다.