2011-08-07 22 views
6

Tengo una matriz de muchas cadenas. Quiero clasificarlos en un diccionario, por lo que todas las cadenas que comienzan con la misma letra entran en una matriz y luego la matriz se convierte en el valor de una clave; la clave sería la letra con la que comienzan todas las palabras en su matriz de valores.Clasificar matriz en el diccionario

Ejemplo

Key = "A" >> Value = "array = apple, animal, alphabet, abc ..." 
Key = "B" >> Value = "array = bat, ball, banana ..." 

¿Cómo puedo hacer eso? ¡Muchas gracias de antemano!

Respuesta

15
NSArray *list = [NSArray arrayWithObjects:@"apple, animal, bat, ball", nil]; 
NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
for (NSString *word in list) { 
    NSString *firstLetter = [[word substringToIndex:1] uppercaseString]; 
    NSMutableArray *letterList = [dict objectForKey:firstLetter]; 
    if (!letterList) { 
     letterList = [NSMutableArray array]; 
     [dict setObject:letterList forKey:firstLetter]; 
    } 
    [letterList addObject:word]; 
} 
NSLog(@"%@", dict); 
+1

Tenga en cuenta que probablemente terminará con muchas más de 26 matrices en 'dict' frente a la entrada UTF-8 y en idiomas distintos del inglés. Este código seguirá funcionando, pero hay una gran cantidad de detalles intrincados a la hora de clasificar las palabras que no están en inglés. – bbum

+0

Claro, tenemos más de 26 letras en otras partes del mundo. ;) Realmente no veo por qué esto sería un problema. La pregunta no era cómo ordenarlos (fácil con 'localizedCompare:' btw), sino cómo agruparlos con la primera letra. No hay nada en la pregunta sobre un requisito para terminar exactamente con 26 matrices. – omz

+0

Correcto, es por eso que le di un optimismo. Solo señalando que Ä, A y Å van a terminar en cubos separados que pueden importar o no (y, por supuesto, ¿cuál es el mapeo en mayúsculas para cosas como 鵝 叫聲, 汽車, кряскам, भौंपू बजाना, 按喇叭, לִצפּוֹר, o κραυγή αγριόχηνας, κορνάρ?). – bbum

0

Utilice esta opción para ordenar el contenido de matriz en orden alfabético, más que el diseño de la exigencia

[keywordListArr sortUsingSelector: @selector (localizedCaseInsensitiveCompare :)];

-1

Acabo de escribir esta muestra. Se ve simple y hace lo que necesita.

NSArray *names = [NSArray arrayWithObjects:@"Anna", @"Antony", @"Jack", @"John", @"Nikita", @"Mark", @"Matthew", nil]; 

NSString *alphabet = @"ABCDEFGHIJKLMNOPQRSTUWXYZ"; 
NSMutableDictionary *sortedNames = [NSMutableDictionary dictionary]; 

for(int characterIndex = 0; characterIndex < 25; characterIndex++) { 
    NSString *alphabetCharacter = [alphabet substringWithRange:NSMakeRange(characterIndex, 1)]; 
    NSArray *filteredNames = [names filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF BEGINSWITH[C] %@", alphabetCharacter]];   
    [sortedNames setObject:filteredNames forKey:alphabetCharacter]; 
} 

//Just for testing purposes let's take a look into our sorted data 
for(NSString *key in sortedNames) { 
    for(NSString *value in [sortedNames valueForKey:key]) { 
     NSLog(@"%@:%@", key, value); 
    } 
} 
+0

Esto no funcionará con UTF-8 y el uso de una predicción en ese ciclo va a ser muy lento en comparación con la solución de omz. – bbum

1

Puede lograr lo que desea a través de los siguientes pasos:

  1. crear un diccionario vacío pero mutable.
  2. Obtén el primer personaje.
  3. Si no existe una clave para ese carácter, créelo.
  4. Agregue la palabra al valor de la clave (debe ser un NSMutableArray).
  5. Repita el paso # 2 para todas las teclas.

Aquí está el código de Objective-C para estos pasos. Tenga en cuenta que supongo que desea que las claves sean case insensible.

// create our dummy dataset 
NSArray * wordArray = [NSArray arrayWithObjects:@"Apple", 
         @"Pickle", @"Monkey", @"Taco", 
         @"arsenal", @"punch", @"twitch", 
         @"mushy", nil]; 
// setup a dictionary 
NSMutableDictionary * wordDictionary = [[NSMutableDictionary alloc] init]; 
for (NSString * word in wordArray) { 
    // remove uppercaseString if you wish to keys case sensitive. 
    NSString * letter = [[word substringWithRange:NSMakeRange(0, 1)] uppercaseString]; 
    NSMutableArray * array = [wordDictionary objectForKey:letter]; 
    if (!array) { 
     // the key doesn't exist, so we will create it. 
     [wordDictionary setObject:(array = [NSMutableArray array]) forKey:letter]; 
    } 
    [array addObject:word]; 
} 
NSLog(@"Word dictionary: %@", wordDictionary); 
Cuestiones relacionadas