【问题标题】:Objective-C Matching Objects Between Two ArraysObjective-C 匹配两个数组之间的对象
【发布时间】:2014-08-25 11:56:32
【问题描述】:

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


    }
}

}

【问题讨论】:

  • this的可能重复
  • 请提供您尝试过的示例代码。

标签: objective-c arrays nsarray matching


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这里是伪代码,希望它能帮助你理解你必须如何工作:

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

    【讨论】:

    • 这只会找到两个数组中相同位置的对象。特别是,对于您显示的数组,它不会找到匹配的。我认为这不是问题所要寻找的。​​span>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    相关资源
    最近更新 更多