2014-07-04 68 views
1

我目前正在学习Objective-C。我正在学习的这本书给了我一个挑战,在这里我给了两个数组,我应该创建一个程序来显示在这两个数组中列出的对象。Objective-C两个阵列之间的匹配对象

我已经设置好了一切,唯一困难的是比较两个数组并返回两个数组中出现的内容。他们都是很长的名单,而我所有的尝试都没有出现,甚至崩溃。

如何做到这一点的任何帮助将是伟大的。

编辑:这是我到目前为止所做的...我不能举出我之前尝试过的例子,因为我会使用诸如isEqualToString:,predicateWithFormat:之类的东西,并且在它没有我会删除代码。

我很抱歉,如果我的代码包含明显的错误,让我再次提到我是新的。

{ @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

的可能的复制[this](http://stackoverflow.com/a/1138417/1215715) – Ryan

+0

请提供您尝试过的示例代码。 – sarin

回答

5

有很多方法。一个直接的一个,但不是很有效:

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

鉴于阵列大,反复查找使用-contains:将是昂贵的。它必须搜寻array1中每个项目的全部array2

之类的查找更加高效使用一组,所以你可能会做:

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

这可以更简单,可能通过使用集合运算速度更快。手头的任务基本上是交集(假设你不关心最终收集的通用物品的顺序)。所以,你可以这样做:

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

如果你正在寻找一个班轮,你可以用NSPredicate做到这一点,虽然,再次,它可能不是非常高效:

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

这里是伪代码,希望这将帮助你了解你怎么也得工作:

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

这只能找到两个数组中相同位置的对象。特别是在你显示的数组中,它将找不到任何匹配的数组。我不认为这就是问题所在。 –

+0

哦,是的......你是对的...... – iphonemaclover