web-dev-qa-db-fra.com

Récupère l'index de l'objet dans le tableau pour rechercher l'objet correspondant dans un autre tableau

J'ai deux tableaux. L'un est un tableau de noms et l'autre est un tableau composé de chaînes intitulées "Oui" ou "Non". Le chemin d'index de chaque nom dans le tableau "name" correspond au même chemin d'index dans le tableau "Oui/Non". Par exemple:

Names Array | Yes/No Array
Person 1    | Yes
Person 2    | No
Person 3    | Yes

Quel serait le moyen le plus simple de rechercher le nom d'une personne (en obtenant éventuellement le chemin de son index) et de vérifier si elle correspond à "Oui" ou à "Non" dans le tableau "Oui/Non"?

En outre, je ne suis pas sûr si "chemin d'index" est le bon terme à utiliser. Si ce n'est pas le cas, je parle du nombre d'objets dans un tableau.

19
Preston

NSArray a une méthode appelée indexOfObject qui renvoie soit l'index le plus bas dont la valeur de tableau correspondante est égale à anObject ou NSNotFound si aucun objet de ce type n'est trouvé. Si votre tableau de noms n'est pas trié, utilisez-le pour obtenir l'index que vous pourrez ensuite connecter au tableau Oui/Non. C'est-à-dire quelque chose dans ce sens:

NSString *answer = nil;
NSUInteger index = [namesArray indexOfObject:@"John Smith"];
if (index != NSNotFound) {
    answer = [yesNoArray objectAtIndex:index];
}
return answer;

Comme Bavarious pose des questions là où je suppose, voici une meilleure façon de classer par ordre alphabétique le tableau de noms.

int index = [self findName:@"John Smith"];
NSString *answer = nil;
if (index >= 0) {
    answer = [yesNoArray objectAtIndex:index];
}
return answer;

où la fonction findName est une recherche binaire simple:

-(int)findName:(NSString *)name {
    int min, mid, max;
    NSComparisonResult comparisonResult;
    min = 0;
    max = [namesArray count]-1;
    while (min <= max) {
        mid = min + (max-min)/2;
        comparisonResult = [name compare:[namesArray objectAtIndex:mid]];
        if (comparisonResult == NSOrderedSame) {
            return mid;
        } else if (comparisonResult == NSOrderedDescending) {
            min = mid+1;
        } else {
            max = mid-1;
        }
    }   
    return -1;  
}
31
PengOne

Essayer de garder deux tableaux synchronisés, c'est simplement demander des problèmes. Cela peut être fait, bien sûr, mais chaque fois que vous modifiez un tableau, vous devez vous rappeler d’apporter une modification correspondante à l’autre. Faites-vous une faveur et évitez toute cette classe de bugs en repensant la façon dont vous stockez les données.

Dans ce cas, vous avez une paire {personne, booléen}. Une option consiste à stocker chaque paire en tant que dictionnaire, puis à conserver un tableau de ces dictionnaires. Ce plan serait particulièrement utile si vous pouviez augmenter le nombre d'éléments de données au-delà de deux. Une autre option serait simplement d'utiliser un dictionnaire où les clés sont des noms de personnes et les valeurs sont vos valeurs oui/non. Cela rend la réponse à votre question très simple:

NSString *yesOrNo = [personDictionary objectForKey:personName];

Pour revenir à votre question initiale, où vous avez encore les deux tableaux, la chose la plus facile est de parcourir le tableau de personnes jusqu'à ce que vous trouviez la personne. vous recherchez, obtenez l'index de ce nom, puis recherchez la valeur correspondante dans le tableau oui/non:

for (person in peopleArray) {
    if ([person isEqualToString:thePersonYoureLookingFor]) {
        yesNoValue = [yesNoArray objectAtIndex:[peopleArray indexOfObject:person];
        break;
    }
}

C'est bien si le nombre de personnes dans la liste n'est pas trop important. Si la liste peut être longue, gardez le tableau de personnes trié de manière à pouvoir effectuer une recherche binaire. Le problème ici, cependant, est que votre tableau oui/non est séparé, donc le tri du personArray tout en maintenant le tableau oui/non dans le bon ordre devient compliqué.

9
Caleb

Vous pouvez également utiliser ci-dessous du code, qu'il vous soit utile,

NSSortDescriptor *_lastDescriptor = [[NSSortDescriptor alloc] initWithKey:@"" ascending:YES];
NSArray *_lastArray = [NSArray arrayWithObject:_lastDescriptor];


firstCharacterArray = (NSMutableArray *)[[nameIndexesDictionary allKeys]      
sortedArrayUsingDescriptors:_lastArray];
//firstCharacterArray = (NSMutableArray *)[[nameIndexesDictionary allKeys]                    
sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

for (NSString *eachlastIndex in firstCharacterArray)
{
NSSortDescriptor *lastDescriptor = [[NSSortDescriptor alloc] initWithKey:@""
                                                               ascending:YES];
//selector:@selector(localizedCaseInsensitiveCompare:)] ;
NSArray *descriptorslast = [NSArray arrayWithObject:lastDescriptor];
[[nameIndexesDictionary objectForKey:eachlastIndex]     
sortUsingDescriptors:descriptorslast];
[lastDescriptor release];
}
2
Dinesh_

Vous pouvez utiliser la méthode indexOfObject pour obtenir l'index de l'élément.

par exemple

Cela vous donnera un index de votre objet

  NSInteger index = [yourArray indexOfObject:objectName];

Pour voir l'élément correspondant d'un autre tableau

[anotherArray objectAtIndex:index];

Cela a fonctionné pour moi. J'espère que cela t'aides.

0
Pradumna Patil