Eu tenho um NSArray
que contém strings de data (ou seja, NSString) como este: "Thu, 21 May 09 19:10:09 -0700"
Eu preciso classificar a NSArray
data. Pensei em converter a string de data em um NSDate
objeto primeiro, mas fiquei preso lá em como classificar pelo NSDate
objeto.
Obrigado.
Respostas:
Armazene as datas como
NSDate
objetos em um array NS (mutável), então use-[NSArray sortedArrayUsingSelector:
ou-[NSMutableArray sortUsingSelector:]
e passe@selector(compare:)
como o parâmetro. O-[NSDate compare:]
método ordenará as datas em ordem crescente para você. Isso é mais simples do que criar umNSSortDescriptor
e muito mais simples do que escrever sua própria função de comparação. (osNSDate
objetos sabem como se comparar uns aos outros pelo menos tão eficientemente quanto poderíamos alcançar com o código personalizado.)fonte
Se eu tiver um
NSMutableArray
de objetos com um campo "beginDate" do tipoNSDate
, estou usando umNSSortDescriptor
como abaixo:NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE]; [myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; [sortDescriptor release];
fonte
-[NSMutableArray sortUsingComparator:]
(10.6+) e passar um bloco que retorna o resultado da chamada-compare:
nos dois campos. Provavelmente seria mais rápido do que chamar-valueForKey:
cada objeto. Você também pode usar-sortWithOptions:usingComparator:
e passar opções para classificar simultaneamente.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 pressupõe que a data seja armazenada como
NSDate
umNString
, o que não deve ser problema de fazer / fazer. De preferência, recomendo também armazenar os dados em seu formato bruto. Facilita a manipulação em situações como essa.fonte
Você pode usar blocos para classificar no local:
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ê converta todas as suas strings em datas antes de classificar para não fazer a conversão mais vezes do que os itens de data. Qualquer algoritmo de classificação fornecerá mais conversões de string para data do que o número de itens na matriz (às vezes, substancialmente mais)
um pouco mais sobre a classificação de blocos: http://sokol8.blogspot.com/2011/04/sorting-nsarray-with-blocks.html
fonte
O que funcionou no meu caso foi o seguinte:
Eu tinha um dicionário, onde todas as chaves eram datas no formato dd-MM-aaaa. E allKeys retorna as chaves do dicionário desordenadas, e eu queria apresentar os dados em ordem cronológica.
fonte
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 em seusortArrayUsingFunction:context:
lugar.fonte
NSDate
objetos, você pode usar minha resposta acima, ou mesmo usar-[NSMutableArray sortUsingComparator:]
, que foi adicionado em 10.6.Depois de ter um
NSDate
, você pode criar umNSSortDescriptor
cominitWithKey:ascending:
e usarsortedArrayUsingDescriptors:
para fazer a classificação.fonte
Swift 3.0
myMutableArray = myMutableArray.sorted(by: { $0.date.compare($1.date) == ComparisonResult.orderedAscending })
fonte
Mude isso
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];
Basta mudar a CHAVE: deve ser
Date
semprefonte