Pergunta

Qual é a maneira mais eficiente de objetos de classificação em um NSSet / NSMutableSet com base em uma propriedade dos objetos no set? Neste momento, a maneira que eu estou fazendo isso é por iteração através de cada objeto, adicioná-los a uma NSMutableArray, e classificar essa matriz com NSSortDescriptor.

Foi útil?

Solução

tente usar

[[mySet allObjects] sortedArrayUsingDescriptors:descriptors];

Editar : Para iOS = 4.0 e Mac OS X = 10,6 você pode usar diretamente

[mySet sortedArrayUsingDescriptors:descriptors];

Outras dicas

A "forma mais eficiente" para classificar um conjunto de objetos varia de acordo com o que você realmente quer dizer. A suposição ocasional (que as respostas anteriores fazer) é uma espécie única de objetos em um conjunto. Neste caso, eu diria que é praticamente uma disputa acirrada entre o @cobbal sugere e que você veio com - provavelmente algo como o seguinte:

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

(eu digo que é um lance-up por causa de @ cobbal abordagem cria duas matrizes autoreleased, então as duplas pegada de memória. Isto é irrelevante para pequenos conjuntos de objetos, mas tecnicamente, nenhuma abordagem é muito eficiente.)

No entanto , se você está classificando os elementos no conjunto mais de uma vez (e especialmente se for uma coisa normal) este não é definitivamente uma abordagem eficiente. Você poderia manter um NSMutableArray em volta e mantê-lo sincronizado com o NSSet, em seguida, chamar -sortUsingDescriptors: cada vez, mas mesmo se a matriz já está classificado ainda vai exigir comparações N

.

Cocoa por si só não fornecem uma abordagem eficiente para a manutenção de uma coleção em ordem de classificação. Java tem uma classe TreeSet que mantém os elementos na ordem de classificação, sempre que um objecto é inserido ou removido, mas não faz cacau. Foi precisamente esse problema que me levou a desenvolver algo semelhante para meu próprio uso.

Como parte de um quadro de estruturas de dados que herdei e renovada, eu criei um protocolo e algumas implementações para conjuntos ordenados . Qualquer uma das subclasses concretas irá manter um conjunto de objetos distintos na ordem de classificação. Há ainda aperfeiçoamentos a serem feitos - o lugar, sendo que ele classifica com base no resultado de -compare: (qual cada objeto no conjunto deve implementar) e ainda não aceitar uma NSSortDescriptor. (A solução é implementar -compare:. Comparar a propriedade de interesse nos objetos)

Uma possível desvantagem é que essas classes são (atualmente) não subclasses de NS (Mutante) Set, então se você deve passar por um NSSet, não serão ordenados. (O protocolo tem um método -conjunto que retorna um NSSet, que é, naturalmente, não ordenada.) Eu pretendo corrigir isso em breve, como eu fiz com as subclasses NSMutableDictionary no quadro. O feedback é definitivamente bem-vindo. : -)

Para iOS = 5.0 e Mac OS X = 10,7 você pode usar diretamente NSOrderedSet

NSSet é uma coleção de objetos desordenados. Olhando a maçã referências Arrays são coleções ordenada.

Olhando para NSArray há uma discussão de exemplos de triagem no http://developer.apple.com/documentation/Cocoa/Conceptual/Collections/Articles/sortingFilteringArrays ...

Exemplo do link:

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];

Você não pode tipo NSSet, porque "sortedArrayUsingFunction:" conjunto de resultados como NSArray ... E todo o trabalho dica superior com apenas Matriz:)

NSArray *myArray = [mySet sortedArrayUsingDescriptors:descriptors];

Trabalho perfeito, e não precisa de outra maneira:)

Desde OS X 10.7 e iOS 5.0 há NSOrderedSet. Você pode usá-lo para manter objetos em conjunto e manter a sua ordem. NSMutableOrderedSet tem métodos para triagem. Em algumas situações, isso pode dar uma melhoria de desempenho, desde que você não tem que criar objeto separado como NSArray para armazenar classificadas itens.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top