2011-07-27 95 views
0

我有這段代碼可以在文本文件中讀取,並用換行符分隔單詞。我想要做的是將所有單詞讀入數組,然後從該數組中選取所有六個字母的單詞。從一個數組中獲取特定長度的字符串

我在下面有這段代碼,但它似乎是從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]; 
} 
+1

對於將來的問題,給出特定的錯誤信息是一個好主意,而不是讓人們猜測你看到的錯誤是什麼,以及在什麼行上。 – smorgan

+0

下次會記住這一點,非常感謝:) – kazuo

回答

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,也不與copymutableCopy開始;因此,根據Cocoa memory management rules,您不擁有它並且不必釋放它。 (如果你希望它在當前方法結束時仍然存在,你需要保留它。)

+0

真棒!非常感謝您的回答! – kazuo

1

您不需要釋放您的文本文件,因爲它將被自動發佈。

編輯:

您需要的Alloc和初始化你的NSMutableArray ...

NSMutableArray* sixLetterWords = [[NSMutableArray alloc] init]; 

我在for循環有點不對,你有正確的第一次。

+0

試過這個,沒有編譯錯誤,但它停止應用程序,當它到達那裏時,特別是在行['6LetterWords addObject:word];'說「線程1:編程接收信號:EXC_BAD_ACCESS」。 – kazuo

+0

閱讀編輯... –

+0

此答案的第一部分錯誤。我 smorgan

0

沒有想吹我自己的小號,CMFunctionalAdditions框架可以做到這一點更乾淨,同時:)

NSArray* sixLetterWords = [allLinedStrings filterWithPredicate:^BOOL(NSString* str) { 
    return [str length] == 6; 
}]; 
+0

感謝您分享您的工作!不過,你應該在類別方法名稱上加上前綴。此外,此方法的名稱與內置的['filteredArrayUsingPredicate:']非常相似(http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html# // apple_ref/doc/uid/20000137-BAJJDBEB),它採用'NSPredicate'對象而不是塊。 –

+0

你是對的,除了最大的集合或最複雜的謂詞外,filderedArrayUsingPredicate是最簡單的解決方案。我認爲蘋果同時運行這個只是時間問題。 –

+0

我只是在談論名稱,而不是實現。無論何時將類別添加到框架類中,都必須確保Apple永遠不會添加名稱與您的名稱相同的方法;傳統的做法是使用前綴:'CM_filteredArrayUsingPredicate:'。 –

相關問題