Почему этот код не помещает объекты 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-чувак Хорошо, исправлено. - person Droppy; 09.10.2014
comment
это работает! Я могу жить с разделенной 1-й строкой; Я просто пропущу это... еще раз спасибо за ваше время, я ценю его. - 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