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

vid*_*son 1 arrays objective-c matching nsarray

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


    }
}
Run Code Online (Sandbox Code Playgroud)

}

Ken*_*ses 6

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

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

鉴于阵列很大,重复查找使用-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];
}
Run Code Online (Sandbox Code Playgroud)

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

NSArray* array1 = /* ... */;
NSArray* array2 = /* ... */;
NSSet* set1 = [NSSet setWithArray:array1];
NSMutableSet* common = [NSMutableSet setWithArray:array2];
[common intersectSet:set1];
Run Code Online (Sandbox Code Playgroud)

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

NSArray* array1 = /* ... */;
NSArray* array2 = /* ... */;
NSArray* common = [array1 filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self IN %@", array2]];
Run Code Online (Sandbox Code Playgroud)