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
'Development Tip' 카테고리의 다른 글
Psql이 서버에 연결할 수 없습니다 : 해당 파일 또는 디렉터리가 없습니다. 5432 오류? (0) | 2020.11.23 |
---|---|
WPF에서 너비를 100 %로 설정하는 방법 (0) | 2020.11.23 |
문자열 이름이 주어진 클래스를 어떻게 인스턴스화합니까? (0) | 2020.11.23 |
WPF TextBlock에 테두리 추가 (0) | 2020.11.23 |
파이썬 배열에서 짝수 / 홀수 줄을 자르는 가장 짧은 방법은 무엇입니까? (0) | 2020.11.23 |