Quiero ordenar una matriz usando NSSortDescriptor


Estoy teniendo un problema con respecto a ordenar una base de datos array w. r. t:

NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"w" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject: sorter]; 

[mGlossaryArray sortUsingDescriptors:sortDescriptors]; 
[sorter release];

Aquí en la base de datos hay algunas primeras letras mayúsculas y debido a esa letra mayúscula no me muestra la salida ordenada adecuada. Aquí estoy ordenando una matriz con r. t " w " que es mi columna de tabla en la base de datos. Aquí tengo adjuntar la captura de pantalla para la salida, que dice que "Cáncer" viene primero que "c", pero esto no es correcto, no está dando orden alfabético debido a la mayúscula palabra.

Eg. si hay " able "en minúsculas y" aCid", entonces mostrará aCid primero y luego able, y también hay un caso en el que si la 1ra letra es mayúsculas, viene primero, por ejemplo," Able "y"a". Aquí Able muestra primero.introduzca la descripción de la imagen aquí

Author: Prash......., 2011-04-04

7 answers

Echa un vistazo aquí: Crear y Usar Descriptores de Ordenación

Se puede comparar como insensible a mayúsculas y minúsculas.

NSSortDescriptor *sorter = [[[NSSortDescriptor alloc]
          initWithKey:@"w"
          ascending:YES
          selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject: sorter];
[mGlossaryArray sortUsingDescriptors:sortDescriptors]; 
 167
Author: Hobbes the Tige,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-26 03:11:26

Simplemente use NSSortDescriptor como lo usé y funcionó bien.

   NSSortDescriptor * sortByRank = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
 39
Author: Prakash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-15 03:49:27

¿Puedo sugerir el uso de-localizedStandardCompare: (NSString)?

"Este método debe usarse siempre que se presenten nombres de archivo u otras cadenas en listas y tablas donde sea apropiado ordenar de forma similar al Finder. El comportamiento exacto de ordenación de este método es diferente en diferentes lugares y puede ser cambiado en futuras versiones."

 5
Author: Christian Kienle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-24 13:05:55

Puede usar esto para ordenar una matriz de acuerdo con el nombre que también contiene letra pequeña :

NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:@"w" ascending:YES selector:@selector(caseInsensitiveCompare:)];

NSArray *sortDescriptors = [NSArray arrayWithObject:sorter]; 

[mGlossaryArray sortUsingDescriptors:sortDescriptors];

Este código funciona bien para mí para ordenar el nombre de acuerdo con alfabetos que también tiene un carácter pequeño,es decir,rocky,Ajay, john, Bob, etc.

 3
Author: Lalit Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-29 09:16:23

Creo que esto hará el truco para usted. Los documentos para ello están aquí: Guía de Programación de cadenas

Añade esta pequeña función escrita por Apple.

int finderSortWithLocale(id string1, id string2, void *locale)
{
    static NSStringCompareOptions comparisonOptions =
        NSCaseInsensitiveSearch | NSNumericSearch |
        NSWidthInsensitiveSearch | NSForcedOrderingSearch;

    NSRange string1Range = NSMakeRange(0, [string1 length]);

    return [string1 compare:string2
                    options:comparisonOptions
                    range:string1Range
                    locale:(NSLocale *)locale];
}

Asegúrese de copiar la definición de la función en su encabezado, o obtendrá un error de compilación en su matriz ordenada.

Para su matriz ordenada, use este método:

[mGlossaryArray sortedArrayUsingFunction:finderSortWithLocale context:[NSLocale currentLocale]];

Sus resultados se verán así:

  • c
  • cabina
  • café
  • Cáncer
  • Chino
  • Cristianismo
  • Navidad
  • Coque
 2
Author: Hobbes the Tige,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-05 14:09:48

Este código está funcionando bien para mí.

- (void)sortSearchResultWithInDocumentTypeArray:(NSMutableArray *)aResultArray basedOn:(NSString *)aSearchString {

    NSSortDescriptor * frequencyDescriptor =[[NSSortDescriptor alloc] initWithKey:aSearchString ascending:YES comparator:^(id firstDocumentName, id secondDocumentName) {

        static NSStringCompareOptions comparisonOptions =
        NSCaseInsensitiveSearch | NSNumericSearch |
        NSWidthInsensitiveSearch | NSForcedOrderingSearch;

        return [firstDocumentName compare:secondDocumentName options:comparisonOptions];
     }];

    NSArray * descriptors =    [NSArray arrayWithObjects:frequencyDescriptor, nil];
    [aResultArray sortUsingDescriptors:descriptors];
}
 2
Author: Varsheen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-21 02:15:30

Una forma alternativa del método finder sort with locale de Apple utiliza el bloque comparador, útil si estás en un entorno ARC y no quieres tratar con casts de puente, etc.:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"your_string_key" ascending:YES comparator:^NSComparisonResult(id obj1, id obj2) {
    NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch | NSWidthInsensitiveSearch | NSForcedOrderingSearch;
    NSRange string1Range = NSMakeRange(0, ((NSString *)obj1).length);
    return [(NSString *)obj1 compare: (NSString *)obj2 options: comparisonOptions range: string1Range locale: [NSLocale currentLocale]];
}];

NSArray *sortedArray = [originalArray sortedArrayUsingDescriptors:@[sortDescriptor]];

Yo también recomendaría almacenar la configuración regional actual en una variable local para fines de eficiencia.

 2
Author: Ari Braginsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-28 19:51:18