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)
}
有很多方法.一个简单的,但不是很有效:
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)
归档时间: |
|
查看次数: |
1704 次 |
最近记录: |