2012-04-03 4 views
0

Цель состоит в том, чтобы иметь массив, где все строки имеют длину n.Чтение из plist, но принятие только определенных строк

Итак, в настоящий момент, что у меня есть мой код, читается в plist (который составляет всего 250 000 строк) в массив, а затем итерации по массиву, чтобы найти, какие из них не имеют длины n , Конечно, ради эффективности, я бы предпочел, чтобы я мог читать из plist STRING BY STRING, поэтому, когда я читаю, я могу использовать длину до вставки в массив. Я только начинаю изучать цель-c, но я искал для Google решение для решения = P

EDIT: Ну, я только что узнал, что могу найти гораздо больше документов, набирая список свойств, а не вставлять в google :) так что я могу сам это выяснить

+1

Это хорошо, если вы узнали о себе. Понятно, если вы опубликуете решение в качестве ответа или принимаете другое. –

+0

Настоящее предположение после чтения документации заключается в том, что нет никакого метода разбора - вы в основном читаете во всем файле, а затем делаете что-то оттуда (в отличие от C на том месте, где вы могли бы читать строки за строкой/char с помощью char с различные fget). Таким образом, метод, предложенный ниже NeverBe, кажется мне достаточно хорошим - мне больше не нужно перебирать его дважды, так как я сохраняю длину, когда читаю; обновление по повторяющимся циклам моего оригинала – Paul

ответ

3

Вы можете разделить plist на дерево (NSMutableDictionary). У Dict будут ключи с именем длины строки.

, например

NSMutableDictionary *result = [NSMutableDictionary dictionary]; 

for (NSString *str in [plistDict allObjects]) { 

    NSString *key = [NSString stringWithFormat:@"%d", [str length]]; 

    NSMutableArray *array = [result objectForKey:key]; 
    if (!array) { 
     array = [NSMutableArray array]; 
    } 
    [array addObject:str]; 
    [result setObject:array forKey:key]; 
} 

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

NSArray *string4Lenght = [result objectForKey:@"4"]; 
+0

О, это очень умное решение. Спасибо =] – Paul

1

компанией Apple не предоставляет API для постепенного разбора PLIST.

Если вы храните свой plist в формате XML, вы можете использовать NSXMLParser, чтобы разобрать его. Схема довольно проста и несколько описана в Property List Programming Guide.

Если вы хотите поэтапно разобрать двоичный формат, вам придется больше работать. Официальной документации для формата нет. Исходный код Apple для чтения и записи формата является открытым исходным кодом (CFBinaryPList.c), и есть некоторые полезные комментарии вместе с фактическим кодом.

Если вам действительно нужно сделать это постепенно, я предлагаю перейти по маршруту XML. Если вы это сделаете, вы можете захотеть подкласса NSInputStream, чтобы иметь возможность читать из файла gzip или bzip2 и распаковывать «на лету».

Смежные вопросы