Classificar NSArray de strings de data ou objetos
-
16-09-2019 - |
Pergunta
Eu tenho um NSArray
que contém textos de data (i NSString.) assim: "Qui, 21 de 09 de maio 19:10:09 -0700"
Eu preciso classificar a NSArray
por data. Eu pensei sobre como converter a seqüência de data para um objeto NSDate
primeiro, mas ficou preso lá sobre como classificar pelo objeto NSDate
.
Graças.
Solução
Loja as datas como objetos NSDate
em um (Mutante) Matriz NS, então use -[NSArray sortedArrayUsingSelector:
ou -[NSMutableArray sortUsingSelector:]
e passar @selector(compare:)
como parâmetro. Os -[NSDate compare:]
datas método ordem será em ordem crescente para vocês. Este é mais simples do que a criação de um NSSortDescriptor
, e muito mais simples do que escrever sua própria função de comparação. (Objetos NSDate
saber como comparar-se uns aos outros, pelo menos de forma tão eficiente como poderíamos esperar realizar com código personalizado.)
Outras dicas
Se eu tiver um NSMutableArray
de objetos com um campo "beginDate" do tipo NSDate
Eu estou usando um NSSortDescriptor
como abaixo:
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
Você também pode usar algo como o seguinte:
//Sort the array of items by date
[self.items sortUsingComparator:^NSComparisonResult(id obj1, id obj2){
return [obj2.date compare:obj1.date];
}];
Mas isso assume que a data é armazenada como um NSDate
sim uma NString
, que não deve ser problema para fazer / fazer. De preferência, eu recomendo também armazenar os dados em seu formato raw. Faz com que seja mais fácil de manipular em situações como esta.
Você pode usar blocos para classificar no lugar:
sortedDatesArray = [[unsortedDatesArray sortedArrayUsingComparator: ^(id a, id b) {
NSDate *d1 = [NSDate dateWithString: s1];
NSDate *d2 = [NSDate dateWithString: s2];
return [d1 compare: d2];
}];
Eu sugiro que você converter todos os seus cordelinhos para datas antes de classificar a não fazer a conversão mais vezes do que há artigos da data. Qualquer algoritmo de classificação vai lhe dar mais corda para conversões de data do que o número de itens na matriz (por vezes substancialmente mais)
um pouco mais sobre blocos de classificação: http: // sokol8 .blogspot.com / 2011/04 / classificação-NSArray-com-blocks.html
O que funcionou no meu caso foi o seguinte:
NSArray *aUnsorted = [dataToDb allKeys]; NSArray *arrKeys = [aUnsorted sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { NSDateFormatter *df = [[NSDateFormatter alloc] init]; [df setDateFormat:@"dd-MM-yyyy"]; NSDate *d1 = [df dateFromString:(NSString*) obj1]; NSDate *d2 = [df dateFromString:(NSString*) obj2]; return [d1 compare: d2]; }];
Eu tinha um dicionário, onde todas as chaves em que datas no formato dd-mm-aaaa. E AllKeys retorna as chaves de dicionário não separados, e eu queria apresentar os dados em ordem cronológica.
Você pode usar sortedArrayUsingFunction:context:
. Aqui está um exemplo:
NSComparisonResult dateSort(NSString *s1, NSString *s2, void *context) {
NSDate *d1 = [NSDate dateWithString:s1];
NSDate *d2 = [NSDate dateWithString:s2];
return [d1 compare:d2];
}
NSArray *sorted = [unsorted sortedArrayUsingFunction:dateSort context:nil];
Ao usar um NSMutableArray
, você pode usar sortArrayUsingFunction:context:
em seu lugar.
Uma vez que você tem uma NSDate
, você pode criar um NSSortDescriptor
com initWithKey:ascending:
e depois usar sortedArrayUsingDescriptors:
para fazer a classificação.
Alterar esta ??p>
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
Para
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Date" ascending:TRUE];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
Apenas alterar a chave: deve ser Date
sempre
Swift 3.0
myMutableArray = myMutableArray.sorted(by: { $0.date.compare($1.date) == ComparisonResult.orderedAscending })