Pregunta

¿Cuál es la forma más eficiente para clasificar objetos en un NSSet / NSMutableSet basado en una propiedad de los objetos en el juego? En este momento la manera en que yo estoy haciendo es por iteración a través de cada objeto, añadirlos a una NSMutableArray, y ordenar que el array con NSSortDescriptor.

¿Fue útil?

Solución

trate de usar

[[mySet allObjects] sortedArrayUsingDescriptors:descriptors];

Editar : Para iOS ≥ 4.0 y Mac OS X 10.6 ≥ puede utilizar directamente

[mySet sortedArrayUsingDescriptors:descriptors];

Otros consejos

La "forma más eficaz" para ordenar un conjunto de objetos varía en función de lo que realmente quiere decir. El supuesto informal (que las respuestas anteriores hacen) es una especie única de objetos en un conjunto. En este caso, yo diría que es más o menos un cara o cruz entre lo que @cobbal y lo que sugiere que se le ocurrió - probablemente algo como lo siguiente:

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

(Yo digo que es un cara o cruz, porque el enfoque de @ cobbal crea dos matrices autoreleased, por lo que la memoria de dobles huella. Este es intrascendente para pequeños grupos de objetos, pero técnicamente, ni el planteamiento es muy eficiente.)

Sin embargo , si está la clasificación de los elementos en el conjunto más de una vez (y sobre todo si es una cosa normal) esto definitivamente no es un enfoque eficaz. Se podría mantener un NSMutableArray alrededor y mantenerlo sincronizado con el NSSet, a continuación, llamar -sortUsingDescriptors: cada vez, pero incluso si la matriz ya está ordenada todavía requerirá N comparaciones

.

El cacao por sí solo no proporciona un enfoque eficaz para el mantenimiento de una colección en forma ordenada. Java tiene un TreeSet clase que mantiene los elementos en orden clasificado cada vez que se introduce o se extrae un objeto, pero Cocoa no lo hace. Fue precisamente este problema que llevó a mí para desarrollar algo similar para mi propio uso.

Como parte de un marco de estructuras de datos que heredé y renovado, he creado un protocolo href="http://dysart.cs.byu.edu/CHDataStructures/protocol_c_h_sorted_set-p.html" rel="noreferrer"> . Cualquiera de las subclases concretas mantendrá un conjunto de objetos distintos en forma ordenada. Todavía hay mejoras que se harán - el principal siendo que ordena basa en el resultado de -compare: (que cada objeto en el conjunto debe aplicar) y todavía no aceptar una NSSortDescriptor. (Una solución consiste en aplicar -compare:. Para comparar la propiedad de interés en los objetos)

Un posible inconveniente es que estas clases son (actualmente) no subclases de NS (mutable) Establecer, por lo que si debe pasar un NSSet, no va a ser ordenados. (El protocolo tiene un método que devuelve un conjunto-NSSet, que por supuesto es desordenada.) Tengo la intención de rectificar que pronto, como yo he hecho con las subclases NSMutableDictionary en el marco. La retroalimentación es sin duda bienvenida. : -)

Para iOS ≥ 5.0 y Mac OS X 10.7 ≥ puede utilizar directamente NSOrderedSet

NSSet es una colección de objetos desordenados. En cuanto a las referencias de manzana Las matrices se ordenó colecciones.

En cuanto a NSArray hay una discusión de ejemplos de clasificación en http://developer.apple.com/documentation/Cocoa/Conceptual/Collections/Articles/sortingFilteringArrays ...

Ejemplo desde el enlace:

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

No es posible ordenar NSSet, porque "sortedArrayUsingFunction:" conjunto de resultados como NSArray ... Y todo indicio superior funciona sólo con la matriz:)

NSArray *myArray = [mySet sortedArrayUsingDescriptors:descriptors];

El trabajo perfecto, y no necesita otra manera:)

Desde OS X 10.7 y el IOS 5.0 no NSOrderedSet. Se puede utilizar para guardar objetos en el juego y mantener su orden. NSMutableOrderedSet tiene métodos para la clasificación. En algunas situaciones esto puede dar una mejora del rendimiento, ya que no tiene que crear el objeto por separado como NSArray para almacenar elementos ordenados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top