【发布时间】:2016-01-27 01:21:24
【问题描述】:
如果这是一个愚蠢的问题,请提前道歉。我正在开发一个简单的程序来比较两个用字符串填充的数组。一个是包含 1309 个专有名称的列表,另一个是包含 235,877 个英文单词的列表。该程序的重点是比较列表,并将两个列表中出现的任何单词添加到可变数组中。然后,程序将枚举可变数组并打印出两个列表上的单词。这是我的代码:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *nameString = [NSString stringWithContentsOfFile:@"/usr/share/dict/propernames"
encoding:NSUTF8StringEncoding
error:NULL];
NSString *wordString = [NSString stringWithContentsOfFile:@"/usr/share/dict/words"
encoding:NSUTF8StringEncoding
error:NULL];
NSArray *names = [nameString componentsSeparatedByString:@"\n"];
NSArray *words = [wordString componentsSeparatedByString:@"\n"];
NSMutableArray *namesAndWords = [[NSMutableArray alloc]init];
for (NSString *w in words){
for (NSString *n in names){
if ([[n lowercaseString] compare:w] == NSEqualToComparison){
[namesAndWords addObject: w];}}}
for (NSString *item in namesAndWords){
NSLog(@"%@", item);}
NSLog(@"There are %lu items in the array",[namesAndWords count]);
NSLog(@"%lu", [names count]);
NSLog(@"%lu", [words count]);
}
return 0;
}
到目前为止,我已经让这个程序完全按照它应该的方式运行(显示 294 个匹配项)。我真正的问题是,当我第一次尝试比较字符串时,我是这样尝试的:
for (NSString *w in words){
for (NSString *n in names){
if ([n caseInsensitiveCompare:w] == NSEqualToComparison){
[namesAndWords addObject: w];}}}
像这样:
for (NSString *w in words){
for (NSString *n in names){
if ([n compare:w options:NSCaseInsensitiveSearch] == NSOrderedSame){
[namesAndWords addObject: w];}}}
这两种方法都给了我 1602 个匹配项,并且出于某种原因将两个数组中的一些项目添加到可变数组 namesAndWords 中。因此,例如在控制台中,我会看到 Woody 和 woody 打印出来。
我尝试的另一种方法是:
for (NSString *w in words){
for (NSString *n in names){
if ([n compare:w] == NSOrderedSame){
[namesAndWords addObject: w];}}}
这样做时,它会从 names 数组中添加所有 1309 个字符串。在运行它之前,我实际上认为我不会得到任何匹配,因为我没有指定它不区分大小写。
我试图弄清楚为什么这些看起来如此相似的方法会产生不同的结果。我也在试图找出为什么if ([[n lowerCaseString] compare:w] == NSEqualToComparison) 是正确的方法。非常感谢这里的任何帮助。
【问题讨论】:
-
不要使用
NSEqualToComparison,使用NSOrderedSame。有关显示有效返回值的compare:方法,请参阅文档。 -
你需要每个单词的原始大小写吗?如果您使用所有单词的小写版本创建两个
NSSet并简单地获取两组的交集,则可以大大提高效率。 -
是的,当找到匹配项时,我希望将
names数组中的字符串添加到namesAndWords可变数组中。这样,当内容显示在控制台中时,它们就是正确的大小写。 -
您可以使用 NSPredicate 进行更快的枚举。 HERE
标签: objective-c nsstring nsarray string-comparison