Objective-C匹配两个数组之间的对象

时间:2014-07-04 07:52:13

标签: objective-c arrays nsarray matching

我目前正在学习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


    }
}

}

2 个答案:

答案 0 :(得分:6)

有很多方法。一个简单的,但不是很有效:

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

鉴于数组很大,使用-contains:重复查找将非常昂贵。它必须为array2中的每个项目搜索可能的所有array1

使用集合进行查找会更有效,所以您可以这样做:

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

使用set操作可以使这更简单,也可能更快。手头的任务基本上是设置交集(假设您不关心生成的常见项集合的顺序)。所以,你可以这样做:

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

答案 1 :(得分: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];
    }
}