2014-07-04 4 views
1

J'apprends actuellement Objective-C. Le livre que j'apprends m'a donné un défi, où l'on me donne deux tableaux et je suis censé créer un programme qui montrerait les objets qui sont listés dans les deux Arrays.Objective-C Objets correspondants entre deux tableaux

J'ai tout mis en place, la seule partie sur laquelle je suis terriblement coincé est de comparer les deux tableaux et de retourner ce qui se passe dans les deux. Ils sont tous les deux de longues listes, et toutes mes tentatives finissent par ne rien montrer du tout ou un accident.

Toute aide sur comment faire ceci serait géniale. Edit: C'est ce que j'ai fait jusqu'ici ... Je ne peux pas donner des exemples de ce que j'ai essayé avant parce que j'utiliserais des choses comme isEqualToString :, predicateWithFormat :, et après il n'a pas travail je voudrais supprimer le code. Je m'excuse si mon code contient des erreurs évidentes, permettez-moi de mentionner à nouveau que je suis nouveau.

{{ @autoreleasepool

// Read in a file as a huge string (ignoring the possibility of an error) 
    NSString *nameString = 
    [NSString stringWithContentsOfFile:@"/usr/share/dict/propernames" 
           encoding:NSUTF8StringEncoding 
           error:NULL]; 
    // Read in a file for words 
    NSString *wordString = 
    [NSString stringWithContentsOfFile:@"/usr/share/dict/words" 
    encoding:NSUTF8StringEncoding 
    error:NULL]; 


    // Break it into an array of strings 
    NSArray *namesArray = [nameString componentsSeparatedByString:@"\n"]; 

    // Break words into an array of strings 
    NSArray *wordArray = [wordString componentsSeparatedByString:@"\n"]; 



    // Go through the array one string at a time 
    for (NSString *n in namesArray) { 

     // Here is where I'm at 


    } 
} 

}

+0

double possible de [this] (http://stackoverflow.com/a/1138417/1215715) – Ryan

+0

Veuillez fournir un exemple de code de ce que vous avez essayé. – sarin

Répondre

5

Il y a beaucoup d'approches . Un simple, mais pas très efficace:

NSArray* array1 = /* ... */; 
NSArray* array2 = /* ... */; 
NSMutableArray* common = [NSMutableArray array]; 
for (id obj in array1) 
{ 
    if ([array2 containsObject:obj]) 
     [common addObject:obj]; 
} 

Étant donné que les tableaux sont grandes, qui a répété consultation à l'aide -contains: sera coûteux. Il doit rechercher tous les array2 pour chaque article dans array1.

Ce genre de consultation est plus efficace en utilisant un ensemble, de sorte que vous pourriez faire:

NSArray* array1 = /* ... */; 
NSArray* array2 = /* ... */; 
NSSet* set = [NSSet setWithArray:array2]; 
NSMutableArray* common = [NSMutableArray array]; 
for (id obj in array1) 
{ 
    if ([set containsObject:obj]) 
     [common addObject:obj]; 
} 

Cela pourrait être rendu plus simple et probablement plus rapide en utilisant les opérations ensemble. La tâche en cours consiste essentiellement à définir une intersection (en supposant que vous ne vous souciez pas de l'ordre de la collection résultante d'éléments communs). Ainsi, vous pouvez faire:

NSArray* array1 = /* ... */; 
NSArray* array2 = /* ... */; 
NSSet* set1 = [NSSet setWithArray:array1]; 
NSMutableSet* common = [NSMutableSet setWithArray:array2]; 
[common intersectSet:set1]; 

Si vous êtes à la recherche d'une seule ligne, vous pouvez le faire avec NSPredicate bien, encore une fois, il ne peut pas être terriblement efficace:

NSArray* array1 = /* ... */; 
NSArray* array2 = /* ... */; 
NSArray* common = [array1 filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self IN %@", array2]]; 
0

Voici le code pseudo espérons qu'il vous aidera à comprendre comment vous devez travailler:

ArrayA=[1,2,3,4]; 
ArrayB=[2,3,4,5]; 

for (int i =0; i< [ArrayA count]; i++) 
{ 
    if ([[ArrayA objectAtIndex:i] isEqual: [ArrayB objectAtIndex:i]]) 
    { 
     NSLog(@"the same"); 
     [<add same object> to ResultArray]; 
    } 
} 
+1

Ceci ne trouve que les objets qui sont dans la même position dans les deux tableaux. En particulier, avec les tableaux que vous avez montrés, il n'en trouvera aucun qui corresponde. Je ne pense pas que ce soit ce que la question cherche. –

+0

oh oui ... c'est vrai ... – iphonemaclover

Questions connexes