Question

Long time développeur de Windows, 1ère fois développeur Objective-C / iPhone veut créer un NSDictionary de NSArrays qui peuvent être affichés dans une plaine UITableView avec des sections alphabétiques.

La source de ce dictionnaire de tableaux est un tableau contenant les noms des magasins classés par ordre alphabétique:

Apple Store
Atlanta Bread Company
Borders
Build-A-Bear Workshop
Cargill Galerie
dillards
Articles de sport de
Dick Eddie Baure
FootLocker
GameStop
Heizberg Diamonds
LensCrafters
Le
de McDonald Nordstrom
Payless ShoeSource
Pottery Barn
Solstice
Starbucks Coffee

secret de Victoria White Barn Candle Co.

Le dictionnaire des tableaux qui est créé à partir de la source devrait ressembler à ceci (type de données entre parenthèses):

Root (Dictionnaire)
.... A (Array)
........ Apple Store (String)
........ Atlanta Bread Company (String)
.... B (Array)
........ Frontières (String)
........ Build-A-Bear Workshop (String)
.... C (Array)
........ Galerie Cargill (String)
.... D (Array)
........ Dillards (String)
........ Sporting Goods Dick (String)
....etc.

Un dictionnaire de tableaux comme la structure ci-dessus renseigne le TableView et affiche comme ceci:

A
Apple Store
Atlanta Bread Company
B
Borders
Build-A-Bear Workshop
C
Cargill Galerie
D
dillards
Articles de sport de
Dick etc.

Le code que j'ai écrit qui crée le dictionnaire des tableaux finit par mettre la dernière magasin (White Barn Candle Co.) après chaque tête de section.

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

Je sais que cela se passe parce que je réutilise un tableau temporaire, peuplant les A, la compensation dehors, peuplant les Bs, la compensation dehors, etc. Voici le code réel qui crée le dictionnaire des tableaux de la source matrice.

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];
        }
    }
}

Je me rends compte que je pouvais « force brute » en créant 26 tableaux distincts et en utilisant une instruction switch pour sélectionner le bon pour remplir mais je ne veux vraiment pas faire cela. Je pensais que quelqu'un de plus familier avec Objective-C pourrait me fournir une solution plus élégante.

Merci d'avance. Faites-moi savoir si vous avez besoin de plus d'informations.

Était-ce utile?

La solution

Je pense que vous voulez faire quelque chose comme ceci:

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];
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top