Método de comparación
O implementas un método de comparación para tu objeto:
- (NSComparisonResult)compare:(Person *)otherObject {
return [self.birthDate compare:otherObject.birthDate];
}
NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(compare:)];
NSSortDescriptor (mejor)
o generalmente incluso mejor:
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate"
ascending:YES];
NSArray *sortedArray = [drinkDetails sortedArrayUsingDescriptors:@[sortDescriptor]];
Puede ordenar fácilmente por varias claves agregando más de una a la matriz. También es posible utilizar métodos de comparación personalizados. Echa un vistazo a la documentación .
Bloques (¡brillantes!)
También existe la posibilidad de ordenar con un bloque desde Mac OS X 10.6 e iOS 4:
NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
NSDate *first = [(Person*)a birthDate];
NSDate *second = [(Person*)b birthDate];
return [first compare:second];
}];
Actuación
Los -compare:
métodos basados en bloques y serán bastante más rápidos, en general, que el uso, NSSortDescriptor
ya que este último se basa en KVC. La principal ventaja del NSSortDescriptor
método es que proporciona una manera de definir su orden de clasificación utilizando datos, en lugar de código, lo que facilita, por ejemplo, configurar las cosas para que los usuarios puedan ordenar NSTableView
haciendo clic en la fila del encabezado.
NSMutableArray
prefiero usar los métodossortUsingDescriptors
,sortUsingFunction
osortUsingSelector
. En la medida en que la matriz sea mutable, generalmente no necesito una copia ordenada.Ver el
NSMutableArray
métodosortUsingFunction:context:
Deberá configurar una función de comparación que tome dos objetos (de tipo
Person
, ya que está comparando dosPerson
objetos) y un parámetro de contexto .Los dos objetos son solo instancias de
Person
. El tercer objeto es una cadena, por ejemplo, @ "birthDate".Esta función devuelve un
NSComparisonResult
: DevuelveNSOrderedAscending
siPersonA.birthDate
<PersonB.birthDate
. VolveráNSOrderedDescending
siPersonA.birthDate
>PersonB.birthDate
. Finalmente, regresaráNSOrderedSame
siPersonA.birthDate
==PersonB.birthDate
.Este es un seudocódigo aproximado; necesitará desarrollar lo que significa que una fecha sea "menos", "más" o "igual" a otra fecha (como comparar segundos desde la época, etc.):
Si desea algo más compacto, puede usar operadores ternarios:
La alineación podría acelerar esto un poco, si haces esto mucho.
fuente
Hice esto en iOS 4 usando un bloque. Tuve que convertir los elementos de mi matriz de id a mi tipo de clase. En este caso, era una clase llamada Score con una propiedad llamada puntos.
También debe decidir qué hacer si los elementos de su matriz no son del tipo correcto, para este ejemplo acabo de regresar
NSOrderedSame
, sin embargo, en mi código, aunque hice una excepción.PD: Esto se ordena en orden descendente.
fuente
downcasting
no requiere un lanzamiento antes de la variable débil.return ((!obj1 && !obj2) ? NSOrderedSame : (obj1 ? NSOrderedAscending : NSOrderedDescending))
A partir de iOS 4, también puede usar bloques para ordenar.
Para este ejemplo en particular, supongo que los objetos en su matriz tienen un método de 'posición', que devuelve un
NSInteger
.Nota: la matriz "ordenada" se lanzará automáticamente.
fuente
Lo intenté todo, pero esto funcionó para mí. En una clase tengo otra clase llamada "
crimeScene
", y quiero ordenar por una propiedad de "crimeScene
".Esto funciona como un encanto:
fuente
Falta un paso en la segunda respuesta de Georg Schölly , pero funciona bien entonces.
// agregué la 's' porque perdí el tiempo cuando copié y pegué y falló sin la 's' en sortedArrayUsingDescriptors
fuente
Gracias, está funcionando bien ...
fuente
Sus
Person
objetos necesitan implementar un método, digamoscompare:
cuál toma otroPerson
objeto, y regresar deNSComparisonResult
acuerdo con la relación entre los 2 objetos.De allí tendría que llamar
sortedArrayUsingSelector:
con@selector(compare:)
y que se debe hacer.Hay otras formas, pero que yo sepa, no hay Cocoa-equiv de la
Comparable
interfaz. UsarsortedArrayUsingSelector:
es probablemente la forma más indolora de hacerlo.fuente
iOS 4 bloques te salvarán :)
http://sokol8.blogspot.com/2011/04/sorting-nsarray-with-blocks.html un poco de descripción
fuente
Para
NSMutableArray
, use elsortUsingSelector
método. Ordena el lugar, sin crear una nueva instancia.fuente
sortUsingComparator:
.Puede usar el siguiente método genérico para su propósito. Debería resolver tu problema.
fuente
Si solo está ordenando una matriz de
NSNumbers
, puede ordenarlos con 1 llamada:Eso funciona porque los objetos en la matriz (
NSNumber
objetos) implementan el método de comparación. Podría hacer lo mismo para losNSString
objetos, o incluso para una matriz de objetos de datos personalizados que implementan un método de comparación.Aquí hay un código de ejemplo que usa bloques comparadores. Ordena una serie de diccionarios donde cada diccionario incluye un número en una clave "sort_key".
El código anterior pasa por el trabajo de obtener un valor entero para cada clave de clasificación y compararlos, como una ilustración de cómo hacerlo. Como los
NSNumber
objetos implementan un método de comparación, podría reescribirse mucho más simplemente:o el cuerpo del comparador podría incluso ser destilado a 1 línea:
Tiendo a preferir declaraciones simples y muchas variables temporales porque el código es más fácil de leer y más fácil de depurar. El compilador optimiza las variables temporales de todos modos, por lo que no hay ninguna ventaja en la versión todo en una línea.
fuente
He creado una pequeña biblioteca de métodos de categoría, llamada Linq para ObjectiveC , que hace que este tipo de cosas sea más fácil. Usando el método de clasificación con un selector de teclas, puede ordenar de la
birthDate
siguiente manera:fuente
Acabo de hacer una clasificación de varios niveles según los requisitos personalizados.
// ordenar los valores
https://sites.google.com/site/greateindiaclub/mobil-apps/ios/multilevelsortinginiosobjectivec
fuente
He usado sortUsingFunction :: en algunos de mis proyectos:
fuente
Utiliza NSSortDescriptor para ordenar un NSMutableArray con objetos personalizados
fuente
fuente
La clasificación
NSMutableArray
es muy simple:fuente
Ordenar usando NSComparator
Si queremos ordenar objetos personalizados, necesitamos proporcionar
NSComparator
, que se utiliza para comparar objetos personalizados. El bloque devuelve unNSComparisonResult
valor para denotar el orden de los dos objetos. Entonces, para ordenar toda la matrizNSComparator
se usa de la siguiente manera.Ordenaciones utilizando NSSortDescriptor
Supongamos, como ejemplo, que tenemos una matriz que contiene instancias de una clase personalizada, Empleado tiene atributos nombre, apellido y edad. El siguiente ejemplo ilustra cómo crear un NSSortDescriptor que se puede usar para ordenar los contenidos de la matriz en orden ascendente por la clave de edad.
Ordenar usando comparaciones personalizadas Los
nombres son cadenas, y cuando ordena cadenas para presentarlas al usuario, siempre debe usar una comparación localizada. A menudo, también desea realizar una comparación entre mayúsculas y minúsculas. Aquí viene un ejemplo con (localizedStandardCompare :) para ordenar la matriz por apellido y nombre.
Para referencia y discusión detallada, consulte: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/SortDescriptors/Articles/Creating.html
http://www.ios-blog.co.uk/tutorials / Objective-c / how-to-sort-nsarray-with-custom-objects /
fuente
Los protocolos y la programación funcional de Swift hacen que sea muy fácil, solo tiene que hacer que su clase se ajuste al protocolo Comparable, implementar los métodos requeridos por el protocolo y luego usar la función ordenada (por:) de orden superior para crear una matriz ordenada sin necesidad de usar matrices mutables por cierto.
fuente
En mi caso, uso "sortedArrayUsingComparator" para ordenar una matriz. Mira el siguiente código.
También mi objeto es,
fuente
Debe crear sortDescriptor y luego puede ordenar nsmutablearray utilizando sortDescriptor como se muestra a continuación.
fuente
Úselo así para objetos anidados,
lastRoute es un objeto y ese objeto contiene el objeto a, que al objeto contiene los valores de cadena de apellido.
fuente
Ordenar matriz en Swift
Para la
Swifty
persona a continuación, es una técnica muy limpia para lograr el objetivo por encima de todo el mundo. Tengamos una clase personalizada de ejemplo de laUser
cual tienen algunos atributos.Ahora tenemos una matriz que debemos clasificar en función de
createdDate
ascendente y / o descendente. Entonces, agreguemos una función para la comparación de fechas.Ahora tengamos un
extension
deArray
paraUser
. En palabras simples, agreguemos algunos métodos solo para aquellos Array que solo tienenUser
objetos.Uso para orden ascendente
Uso para orden descendente
Uso para el mismo pedido
fuente
Versión rápida: 5.1
Si tiene una estructura o clase personalizada y desea ordenarlas arbitrariamente, debe llamar a sort () utilizando un cierre final que se clasifica en un campo que especifique. Aquí hay un ejemplo usando una matriz de estructuras personalizadas que se clasifican en una propiedad particular:
Si desea devolver una matriz ordenada en lugar de ordenarla en su lugar, use sorted () de esta manera:
fuente
fuente
fuente