Compare o método
Você implementa um método de comparação para seu objeto:
- (NSComparisonResult)compare:(Person *)otherObject {
return [self.birthDate compare:otherObject.birthDate];
}
NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(compare:)];
NSSortDescriptor (melhor)
ou geralmente ainda melhor:
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate"
ascending:YES];
NSArray *sortedArray = [drinkDetails sortedArrayUsingDescriptors:@[sortDescriptor]];
Você pode classificar facilmente por várias chaves adicionando mais de uma à matriz. Também é possível usar métodos comparadores personalizados. Dê uma olhada na documentação .
Blocos (brilhantes!)
Há também a possibilidade de classificar com um bloco desde o Mac OS X 10.6 e o 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];
}];
atuação
o -compare:
métodos baseados em bloco e serão um pouco mais rápidos, em geral, do que usar, NSSortDescriptor
já que o último depende do KVC. A principal vantagem do NSSortDescriptor
método é que ele fornece uma maneira de definir sua ordem de classificação usando dados, em vez de código, o que facilita, por exemplo, configurar as coisas para que os usuários possam classificar um NSTableView
clicando na linha do cabeçalho.
NSMutableArray
eu prefiro usar os métodossortUsingDescriptors
,sortUsingFunction
ousortUsingSelector
. Na medida em que a matriz é mutável, geralmente não preciso de uma cópia classificada.Veja o
NSMutableArray
métodosortUsingFunction:context:
Você precisará configurar uma função de comparação que aceite dois objetos (do tipo
Person
, pois você está comparando doisPerson
objetos) e um parâmetro de contexto .Os dois objetos são apenas instâncias de
Person
. O terceiro objeto é uma string, por exemplo, @ "birthDate".Esta função retorna um
NSComparisonResult
: RetornaNSOrderedAscending
sePersonA.birthDate
<PersonB.birthDate
. Ele retornaráNSOrderedDescending
sePersonA.birthDate
>PersonB.birthDate
. Finalmente, ele retornaráNSOrderedSame
sePersonA.birthDate
==PersonB.birthDate
.Esse é um pseudocódigo aproximado; você precisará definir o que significa uma data ser "menor", "mais" ou "igual" a outra data (como comparar segundos desde a época etc.):
Se você quiser algo mais compacto, poderá usar operadores ternários:
Inlining talvez acelere um pouco isso, se você fizer muito isso.
fonte
Eu fiz isso no iOS 4 usando um bloco. Tive que converter os elementos da minha matriz do id para o meu tipo de classe. Nesse caso, era uma classe chamada Score com uma propriedade chamada points.
Além disso, você precisa decidir o que fazer se os elementos da sua matriz não forem do tipo certo; neste exemplo, acabei de retornar
NSOrderedSame
, no entanto, no meu código, pensei em uma exceção.PS: está ordenando em ordem decrescente.
fonte
downcasting
não requer um lançamento antes da variável fraca.return ((!obj1 && !obj2) ? NSOrderedSame : (obj1 ? NSOrderedAscending : NSOrderedDescending))
A partir do iOS 4, você também pode usar blocos para classificação.
Para este exemplo em particular, estou assumindo que os objetos em sua matriz tenham um método 'position', que retorna um
NSInteger
.Nota: a matriz "classificada" será liberada automaticamente.
fonte
Eu tentei tudo, mas isso funcionou para mim. Em uma classe, tenho outra classe chamada "
crimeScene
" e quero classificar por uma propriedade de "crimeScene
".Isso funciona como um encanto:
fonte
Falta um passo na segunda resposta de Georg Schölly , mas funciona bem então.
// adicionou os 's' porque o tempo foi desperdiçado quando copiei e colei e ele falhou sem os 's' em SortArrayUsingDescriptors
fonte
Obrigado, está funcionando bem ...
fonte
Seus
Person
objetos precisam implementar um método, dizercompare:
qual pega outroPerson
objeto e retornar deNSComparisonResult
acordo com o relacionamento entre os dois objetos.Então você ligaria
sortedArrayUsingSelector:
com@selector(compare:)
e isso deve ser feito.Existem outras maneiras, mas até onde eu sei, não existe equivalente de cacau na
Comparable
interface. UsarsortedArrayUsingSelector:
é provavelmente a maneira mais indolor de fazê-lo.fonte
iOS 4 blocos irá salvar você :)
http://sokol8.blogspot.com/2011/04/sorting-nsarray-with-blocks.html um pouco de descrição
fonte
Para
NSMutableArray
, use osortUsingSelector
método Ele classifica o local, sem criar uma nova instância.fonte
sortUsingComparator:
.Você pode usar o seguinte método genérico para sua finalidade. Isso deve resolver seu problema.
fonte
Se você estiver apenas classificando uma matriz de
NSNumbers
, poderá classificá-las com uma chamada:Isso funciona porque os objetos na matriz (
NSNumber
objetos) implementam o método compare. Você pode fazer o mesmo porNSString
objetos ou mesmo por uma matriz de objetos de dados personalizados que implementam um método de comparação.Aqui está um exemplo de código usando blocos comparadores. Ele classifica uma matriz de dicionários em que cada dicionário inclui um número na chave "sort_key".
O código acima passa pelo trabalho de obter um valor inteiro para cada chave de classificação e compará-los, como uma ilustração de como fazê-lo. Como os
NSNumber
objetos implementam um método de comparação, ele pode ser reescrito de maneira muito mais simples:ou o corpo do comparador pode até ser destilado até uma linha:
Costumo preferir declarações simples e muitas variáveis temporárias porque o código é mais fácil de ler e mais fácil de depurar. O compilador otimiza as variáveis temporárias de qualquer maneira, portanto, não há vantagem na versão all-in-one-line.
fonte
Eu criei uma pequena biblioteca de métodos de categoria, chamada Linq to ObjectiveC , que facilita esse tipo de coisa. Usando o método de classificação com um seletor de chave, você pode classificar da
birthDate
seguinte maneira:fonte
Acabei de fazer a classificação em vários níveis com base nos requisitos personalizados.
// classifica os valores
https://sites.google.com/site/greateindiaclub/mobil-apps/ios/multilevelsortinginiosobjectivec
fonte
Eu usei sortUsingFunction :: em alguns dos meus projetos:
fonte
Você usa o NSSortDescriptor para classificar um NSMutableArray com objetos personalizados
fonte
fonte
A classificação
NSMutableArray
é muito simples:fonte
Classificar usando o NSComparator
Se queremos classificar objetos personalizados, precisamos fornecer
NSComparator
, que é usado para comparar objetos personalizados. O bloco retorna umNSComparisonResult
valor para denotar a ordem dos dois objetos. Portanto, para classificar toda a matrizNSComparator
é usada da seguinte maneira.Classificações usando o NSSortDescriptor
Vamos supor, por exemplo, que temos uma matriz que contém instâncias de uma classe personalizada, Employee possui atributos nome, sobrenome e idade. O exemplo a seguir ilustra como criar um NSSortDescriptor que pode ser usado para classificar o conteúdo da matriz em ordem crescente pela chave de idade.
Classificar usando comparações personalizadas Os
nomes são cadeias de caracteres e, quando você classifica as cadeias de caracteres para apresentar ao usuário, sempre deve usar uma comparação localizada. Geralmente, você também deseja realizar uma comparação sem distinção entre maiúsculas e minúsculas. A seguir, um exemplo com (localizedStandardCompare :) para ordenar a matriz pelo sobrenome e primeiro nome.
Para referência e discussão detalhada, consulte: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/SortDescriptors/Articles/Creating.html
http://www.ios-blog.co.uk/tutorials / object-c / como-ordenar-nsarray-com-objetos-personalizados /
fonte
Os protocolos e a programação funcional do Swift tornam muito fácil você apenas tornar sua classe conforme o protocolo Comparável, implementar os métodos exigidos pelo protocolo e, em seguida, usar a função de ordem alta classificada (por:) para criar uma matriz classificada sem a necessidade de usar matrizes mutáveis pelo caminho.
fonte
No meu caso, eu uso "SortArrayUsingComparator" para classificar uma matriz. Veja o código abaixo.
Também meu objetivo é,
fonte
É necessário criar sortDescriptor e, em seguida, você pode classificar o nsmutablearray usando o sortDescriptor como abaixo.
fonte
Use assim para objetos aninhados,
lastRoute é um objeto e esse objeto retém o objeto to, que o objeto retém os valores da string lastname.
fonte
Classificar matriz em Swift
Para
Swifty
Pessoa abaixo, é uma técnica muito limpa para atingir acima da meta globalmente. Vamos ter um exemplo de classe personalizadaUser
com alguns atributos.Agora temos uma matriz que precisamos ordenar com base
createdDate
em ascendente e / ou descendente. Então, vamos adicionar uma função para comparação de datas.Agora vamos ter um
extension
deArray
paraUser
. Em palavras simples, vamos adicionar alguns métodos apenas para aqueles que possuem apenasUser
objetos.Uso para ordem crescente
Uso para ordem decrescente
Uso para a mesma ordem
fonte
Versão Swift: 5.1
Se você possui uma estrutura ou classe personalizada e deseja classificá-las arbitrariamente, chame sort () usando um fechamento à direita que classifique em um campo especificado. Aqui está um exemplo usando uma matriz de estruturas personalizadas classificadas em uma propriedade específica:
Se você deseja retornar uma matriz classificada em vez de classificá-la no lugar, use classificado () assim:
fonte
fonte
fonte