4 votes

boucle dans un tableau de dictionnaires pour trouver une valeur

J'ai un tableau de dictionnaires que je voudrais parcourir pour trouver une valeur correspondante que je peux ensuite compter == Nième élément du tableau.

Chaque élément du tableau ressemble à ceci

HMOD = 0;
MID = 39;
MOD = SOMETHING; // looking for this value
ID = 50;

Je voudrais donc créer une boucle qui parcourt le tableau jusqu'à ce qu'elle trouve la valeur correspondante, puis j'utilise le nombre dans le compte comme référence au chemin d'index dans la vue suivante

J'ai écrit ce morceau de code qui ne fonctionne pas... mais j'espère qu'il vous donne une idée de la boucle que j'essaie de créer.

int count = 0;
while (singleName != [[ModArray valueForKey:@"MOD"] objectAtIndex:count]) {
                    count ++;
                    NSLog(@"%i", count);
                }

SingleName est une NSString que j'utilise pour faire correspondre la valeur MOD dans ModArray... Toute aide serait grandement appréciée.

10voto

iDev Points 16260

Voici une solution plus simple en utilisant valueForKey sur le tableau de dictionnaires,

En supposant que votre modArray c'est comme ça,

NSArray *modArray = [NSArray arrayWithObjects:[NSDictionary dictionaryWithObject:@"0" forKey:@"HMOD"],
                       [NSDictionary dictionaryWithObject:@"39" forKey:@"MID"],
                       [NSDictionary dictionaryWithObject:@"something" forKey:@"MOD"],
                       [NSDictionary dictionaryWithObject:@"50" forKey:@"ID"], nil];

Y singleName a une valeur comme "something"

    NSString *singleName = @"something";

Récupérer le array de modArray qui a un objet dont la clé est "MOD" ,

    NSArray *array = [modArray valueForKey:@"MOD"];

Vérifiez si singleName est présent dans ce array . Si oui, alors on obtient le premier index de cet objet qui sera le même que l'index du dictionnaire avec la clé " . MOD " dans modArray .

    if ([array containsObject:singleName]) {
        NSLog(@"%d", [array indexOfObject:singleName]);
    } else {
        NSLog(@"%@ is not present in the array", singleName);
    }

Mise à jour : Si tu veux le faire à ta manière, la seule erreur était que tu utilisais != alors que vous auriez dû utiliser isEqualToString . Vous auriez dû faire comme ça,

int count = 0;
while (![singleName isEqualToString:[[modArray valueForKey:@"MOD"] objectAtIndex:count]]) {
                    count ++;
                    NSLog(@"%i", count);
                }

3voto

rmaddy Points 79279

Votre code semble tout à l'envers. Vous déclarez avoir un tableau de dictionnaires. En supposant que ModArray est le tableau (basé sur le nom), vous pourriez faire ceci :

NSUInteger count = 0;
for (NSDictionary *dict in ModArray) { // iterate through the array
    NSString *mod = dict[@"MOD"];      // get the value for MOD
    if ([mod isEqualToString:singleName]) {  // compare the two strings
        break;                         // they match so exit the loop
    }
    count++
}

// count has the index of the dictionary with the matching MOD value

Edit : Basé sur ACB corrigeant mon incompréhension de NSArray valueForKey: Le seul vrai problème est l'utilisation de != pour comparer les deux chaînes de caractères.

3voto

jayesh mardiya Points 629
- This is Helpful when you search from Dictionary.

NSMutableArray *contentList;
NSMutableArray *filteredContentList;
BOOL isSearching;

// firstSection is array which already filled.
// contentList array for value of particular key
// filteredContentList is search array from actual array.

  - (void)searchTableList {
        NSString *searchString = searchBar.text;

        NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"frame_code beginswith[c] %@", searchString];
        NSArray *filteredArr = [firstSection filteredArrayUsingPredicate:filterPredicate];
        if(contentList.count > 0)
            [contentList removeAllObjects];
        [filteredContentList addObjectsFromArray:filteredArr];
    }

    - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar1 {

        if ([searchBar1.text length] != 0)
            isSearching = YES;
        else
            isSearching = NO;
    }

    - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
        NSLog(@"Text change - %d",isSearching);

        //Remove all objects first.
        [filteredContentList removeAllObjects];

        if([searchText length] != 0) {
            isSearching = YES;
            [self searchTableList];
        }
        else {
            isSearching = NO;
        }
        [tblFrameList_SComplete reloadData];
    }

    - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
        NSLog(@"Cancel clicked");
    }

    - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
        NSLog(@"Search Clicked");
        [self searchTableList];
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X