我目前正在学习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 :(得分: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];
}
}