Защо този код не поставя обектите NSArray в NSMutableArray?

Имам .txt файл със 7 низа, разделени с TAB в него. Искам да взема 7-те низа, един по един, и да разделя всеки от тях чрез разделител в масив, след което да поставя този масив в Променлив масив, откъдето мога да обработя всеки от 7-те обработени низа. Ето моят код:

NSMutableArray *arrayOfSplitStrings = [NSMutableArray arrayWithCapacity:0];

for(int i = 1; i <= inputStrings.count - 1; i++)  {        
    NSArray *oneSplitString = [[NSArray alloc]init];
    arrayOfSplitStrings = [[NSMutableArray alloc]init];

    oneSplitString = [inputStrings[i] componentsSeparatedByString:@"\t"];
    [arrayOfSplitStrings addObjectsFromArray: oneSplitString];
}

Проблемът е, че когато е завършен, arrayOfSplitStrings има само един (1) масив в себе си и той е @""! Разгледах SO и опитах всичко, за което се сетя, но все още не работи. какво правя грешно


person SpokaneDude    schedule 09.10.2014    source източник


Отговори (2)


Този ред кара изходния масив да се създава отново, всяка итерация на цикъла, следователно той просто запазва последния ред на файла:

arrayOfSplitStrings = [[NSMutableArray alloc]init];

Опитвам:

NSMutableArray *arrayOfSplitStrings = [NSMutableArray new];
for (NSUInteger i = 1; i < [inputStrings count]; i++) {
    NSArray *oneSplitString = [[inputStrings[i] componentsSeparatedByString:@"\t"] copy];
    [arrayOfSplitStrings addObject:oneSplitString];
}

(обърнете внимание и на промяната на състоянието на цикъла for).

person Droppy    schedule 09.10.2014
comment
Това поставя всичко (101 обекта) в един (1) масив (arrayOfSplitStrings); ако имам 7 inputStrings, трябва да имам 7 масива oneSplitStrings в arrayOfSplitStrings. (надявам се, че не съм ви объркал)...и цикълът трябва да пропусне първия ред, където са дефинициите на табовете. - person SpokaneDude; 09.10.2014
comment
@spokane-dude Добре, оправено. - person Droppy; 09.10.2014
comment
това работи! Мога да живея с разделянето на първия низ; Просто ще го пропусна... благодаря отново за отделеното време, оценявам го. - person SpokaneDude; 09.10.2014

arrayOfSplitStrings извън цикъла е скрит от NSArray, създаден вътре в цикъла, премахнете го.

Няма нужда да създавате NSArray arrayOfSplitStrings, защото на следващия ред се връща нов масив, необходима е само декларация.

Цикълът for може да бъде промяна на цикъл for-in, като елиминира индексната променлива i.

Възможни са и някои други оптимизации.

NSArray *bodyStrings = [inputStrings subarrayWithRange:NSMakeRange(1, inputStrings.count-1)];
NSMutableArray *arrayOfSplitStrings = [NSMutableArray new];
for (NSString *aString in bodyStrings) {
    NSArray *oneSplitString = [aString componentsSeparatedByString:@"\t"];
    [arrayOfSplitStrings addObject:oneSplitString];
}

Входът:

NSArray *inputStrings = @[@"qw\ter", @"as\tdf", @"zx\tcv"];

произвежда:

arrayOfSplitStrings: (
        (
        as,
        df
    ),
        (
        zx,
        cv
    )
)
person zaph    schedule 09.10.2014