我有这个代码在文本文件中读取,单词用换行符分隔。我想要做的是将所有单词读入数组,然后从该数组中选择所有六个字母的单词。
我在下面有这个代码,但似乎是在for循环中产生错误。
此外,在阅读文本文件后,我是否必须将其发布?
NSString* path = [[NSBundle mainBundle] pathForResource:@"newdict" ofType:@"txt"];
NSString* content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL];
NSArray* allLinedStrings = [content componentsSeparatedByCharactersInSet:
[NSCharacterSet newlineCharacterSet]];
int wordcount = [allLinedStrings count];
int i;
NSMutableArray* sixLetterWords;
for( i = 0 ; i < wordcount ; i++)
{
NSString* word = [allLinedStrings objectAtIndex: i];
if (StrLength(word) == 6)
[sixLetterWords addObject:word];
}
答案 0 :(得分:3)
比for循环更好的选项是fast enumeration:
// Don't forget to actually create the mutable array
NSMutableArray * sixLetterWords = [[NSMutableArray alloc] init];
for( NSString * word in allLinedStrings ){
if( [word length] == 6 ) [sixLetterWords addObject:word];
}
和blocks-based enumeration与enumerateObjectsUsingBlock:
:
NSMutableArray * sixLetterWords = [[NSMutableArray alloc] init];
[allLinedStrings enumerateObjectsUsingBlock:^(id word, NSUInteger idx, BOOL * stop){
if( [(NSString *)word length] == 6 ) [sixLetterWords addObject:word];
}];
还有可能filter the array:
NSArray * sixLetterWords = [allLinedStrings filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"length == 6"
请注意,最后一个选项会为您提供一个自动释放的数组 - 如果您想保留它,则必须保留它。使用其中任何一个,您不再需要担心数组长度或显式索引;它是由数组处理的。正如其名称所示,Fast enumeration也是更快而不是普通的for
循环。
您用于将文本文件读取到字符串stringWithContentsOfFile:encoding:error:
中的方法不是new
或alloc
,也不是以copy
或{{开头1}};因此,根据Cocoa memory management rules,您不拥有它,也不必释放它。 (如果你希望它坚持使用当前方法的结尾,你需要保留它。)
答案 1 :(得分:1)
您不需要发布文本文件,因为它将被自动释放。
编辑:
您需要分配并初始化NsMutableArray ...
NSMutableArray* sixLetterWords = [[NSMutableArray alloc] init];
我的for循环错了,你第一次就把它弄好了。
答案 2 :(得分:0)
CMFunctionalAdditions框架不想吹我自己的小号,可以更干净,更兼容地做到这一点:)
NSArray* sixLetterWords = [allLinedStrings filterWithPredicate:^BOOL(NSString* str) {
return [str length] == 6;
}];