Взятие строк определенной длины из массива - PullRequest
0 голосов
/ 27 июля 2011

У меня есть этот код для чтения в текстовом файле со словами, разделенными символами новой строки. То, что я хочу сделать, это прочитать все слова в массив, а затем выбрать все шесть букв из этого массива.

У меня есть этот код ниже, но кажется, что он генерирует ошибку из цикла 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 ]

3 голосов
/ 27 июля 2011

Лучше, чем цикл for: быстрое перечисление :

// 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];
}    

и перечисление на основе блоков с enumerateObjectsUsingBlock::

NSMutableArray * sixLetterWords = [[NSMutableArray alloc] init];
[allLinedStrings enumerateObjectsUsingBlock:^(id word, NSUInteger idx, BOOL * stop){
    if( [(NSString *)word length] == 6 ) [sixLetterWords addObject:word];
 }];

Существует также возможность фильтровать массив :

NSArray * sixLetterWords = [allLinedStrings filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"length == 6"

Обратите внимание, что этот последний параметр дает вам автоматически освобожденный массив - если вы хотите сохранить его, вы должны сохранить его. С любым из них вам больше не нужно беспокоиться о длине массива или явной индексации; он обрабатывается для вас массивом. Быстрое перечисление также, как указывает его название, быстрее , чем простая for петля.

Метод, который вы использовали для считывания текстового файла в вашу строку, stringWithContentsOfFile:encoding:error:, не является new или alloc и не начинается с copy или mutableCopy; следовательно, согласно правилам управления памятью какао , вы не владеете им и не обязаны их освобождать. (И если вы хотите, чтобы он оставался за концом текущего метода, вам нужно сохранить его.)

1 голос
/ 27 июля 2011

Вам не нужно выпускать текстовый файл, поскольку он будет автоматически освобожден.

РЕДАКТИРОВАТЬ:

Вам необходимо выделить и инициализировать NsMutableArray ...

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

Я ошибся в цикле for, вы сделали это правильно с первого раза.

0 голосов
/ 29 июля 2011

Не желая трубить мою собственную трубу, платформа CMFunctionalAdditions может сделать это более чисто и одновременно:)

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