Pregunta

Mucho tiempo de Windows desarrollador, primera vez Objective-C / iPhone desarrollador quiere crear un NSDictionary de NSArrays que se pueden mostrar en un UITableView llano con secciones alfabéticas.

La fuente para este diccionario de matrices es una matriz que contiene los nombres de las tiendas ordenada alfabéticamente:

Apple Store
Atlanta Bread Company
fronteras
Build-A-Bear Workshop
Cargill Galería de Fotos dillards
Artículos deportivos Dick
Eddie baure
footlocker
GameStop
Los diamantes Heizberg
LensCrafters

McDonald Nordstrom
Payless ShoeSource
Pottery Barn
solsticio de
Starbucks Coffee
Victoria Secret
White Barn Candle Co.

El diccionario de matrices que se crea a partir de la fuente debe ser algo como esto (tipo de datos entre paréntesis):

Raíz (Diccionario)
.... A (Array)
........ Apple Store (String)
........ Atlanta Bread Company (cadena)
.... B (Array)
........ Fronteras (String)
........ Build-A-Bear Workshop (String)
.... C (Array)
........ Cargill Galería (String)
.... D (Array)
........ Dillard (String)
........ Artículos deportivos Dick (String)
.... etc.

Un diccionario de arrays como la estructura anterior rellena el TableView y muestra como esto:

A
Apple Store
Atlanta Bread Company
B Opiniones fronteras
Build-A-Bear Workshop
C
Cargill Galería de Fotos D
dillards
Artículos deportivos Dick
etc.

El código que he escrito que crea el diccionario de matrices termina poniendo la última tienda (White Barn Candle Co.) después de cada encabezado de sección.

A
White Barn Candle Co.
B Opiniones White Barn Candle Co.
C
White Barn Candle Co.
D
White Barn Candle Co.
etc.

Me doy cuenta de que esto está sucediendo porque volver a utilizar una matriz temporal, poblarlo con los Atléticos, despejando hacia fuera, poblarlo con los de B, despejando hacia fuera, etc. Este es el código real que crea el diccionario de matrices de la fuente array.

NSMutableDictionary *places = [[NSMutableDictionary alloc] init];
NSMutableArray *alphaPlace = [[NSMutableArray alloc] init]; 

for (int x = 1; x <= 26; x++) {
    NSString *alphabet = [[NSString alloc] initWithString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZ"];
    NSString *letter = [alphabet substringWithRange:NSMakeRange(x - 1, 1)];

    for (NSString *place in allPlaces) {
        NSString *first = [place substringWithRange:NSMakeRange(0, 1)];
        if ([first isEqualToString:letter] == YES) { // Add to alphaPlace
            [alphaPlace addObject:place];
        }
        else { // Add alphaPlace to places, clear out alphaPlace; add new item to alphaPlace
            [places setValue:alphaPlace forKey:letter];
            [alphaPlace removeAllObjects];  // SAME ARRAY BEING USED FOR ALL LETTERS OF ALPHABET!
            [alphaPlace addObject:place];
        }
    }
}

Me di cuenta que podía "fuerza bruta" mediante la creación de 26 matrices distintas y utilizando una sentencia switch para seleccionar el correcto para poblar pero realmente no quiero hacer eso. Pensé que alguien más familiarizados con Objective-C podría proveer de mí una solución más elegante.

Gracias de antemano. Déjeme saber si usted necesita más información.

¿Fue útil?

Solución

Creo que quiere hacer algo como esto:

NSMutableDictionary *places = [[NSMutableDictionary alloc] init];

// initialize places with an array for each letter
NSString *alphabet = [[NSString alloc] initWithString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZ"];
for (int x = 0; x < 26; x++) {
    NSString *letter = [alphabet substringWithRange:NSMakeRange(x, 1)];
    [places setObject:[NSMutableArray array] forKey:letter];
}

// then put each place in the array corresponding to its first letter
for (NSString *place in allPlaces) {
    NSString *first = [[place substringWithRange:NSMakeRange(0, 1)] uppercaseString];
    NSMutableArray *letterArray = [places objectForKey:first];
    [letterArray addObject:place];
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top