从数组中获取特定长度的字符串

时间:2011-07-27 02:33:23

标签: objective-c cocoa nsstring nsarray enumeration

我有这个代码在文本文件中读取,单词用换行符分隔。我想要做的是将所有单词读入数组,然后从该数组中选择所有六个字母的单词。

我在下面有这个代码,但似乎是在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];
}

3 个答案:

答案 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 enumerationenumerateObjectsUsingBlock:

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:中的方法不是newalloc,也不是以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;
}];