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.

Foi útil?

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

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 })
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top