парсинг NSMutableDictionary с требуемым форматом - PullRequest
0 голосов
/ 12 октября 2018

У меня есть целевой объект C 'Obj' с

@property (strong, nonatomic) NSMutableDictionary *obj;

. Он заполняется данными из API в следующем формате.

{
  0 =     (  0, "7.00", "8.59”, ”15.00”, ”16.59", "19.00", "20.59 );
  1 =      (  1, "7.00", "8.59”, ”15.00”, ”16.59", "19.00", "20.59  );
  2 =     (  2, "7.00", "8.59”, ”15.00”, ”16.59", "19.00", "20.59  );
  3 =     (  3, "7.00", "8.59”, ”15.00”, ”16.59", "19.00", "20.59  );
  4 =     (  4, "7.00", "8.59”, ”15.00”, ”16.59", "19.00", "20.59  );
  5 =     (  5, "7.00", "8.59”, ”15.00”, ”16.59", "19.00", "20.59  );
  6 =      (  6, "7.00", "8.59”, ”15.00”, ”16.59", "19.00", "20.59 );
}

Мне нужно проанализировать данныеи отправьте его обратно в виде массива в следующем формате.

`{
[ 0, 7, 00, 8, 59 ],
[0, 15, 00, 16, 59] , 
[0, 19, 00, 20, 59] , 
[ 1, 7, 00, 8, 59 ],
[1, 15, 00, 16, 59] , 
[1, 19, 00, 20, 59], 
……
……
[ 6, 7, 00, 8, 59 ],
[6, 15, 00, 16, 59] , 
[6, 19, 00, 20, 59] 
}`

Где 0,1,2,3,4,5,6 - дни, а остальная часть информации - часы и минуты.поэтому для каждого слота используется формат

`[day, from_hour, from_min, to_hour, to_min],
 [0, 7, 0, 8, 59],`

В день может быть несколько слотов или только один слот.

Пока мне удается запустить цикл и отделить записи каждого дня, как показано ниже.

NSMutableArray *elementArray =[[NSMutableArray alloc ]init];
NSMutableArray *results =[[NSMutableArray alloc ]init];
NSInteger starthour = 0 ;
NSInteger startmin = 0 ;
NSInteger endhour = 0 ;
NSInteger endmin = 0 ;
NSMutableArray *temp = [[NSMutableArray alloc]init];
NSString *string;
int i = 0;
for ( i = 0; i <=6; i ++){
    string = [NSString stringWithFormat:@"%d",i];
    elementArray =[Obj.obj valueForKey:string];
    starthour = [[elementArray objectAtIndex:1]integerValue];
    startmin =([[elementArray objectAtIndex:1]floatValue]-[[elementArray objectAtIndex:1]integerValue])*100;
    endhour = [[elementArray objectAtIndex:2]integerValue];
    endmin =([[elementArray objectAtIndex:2]floatValue]-[[elementArray objectAtIndex:2]integerValue])*100;
    NSNumber *day = [NSNumber numberWithInteger:[string integerValue]];
    NSNumber *starthour1 = [NSNumber numberWithInteger:(int)starthour];
    NSNumber *startmin1 = [NSNumber numberWithInteger:(int)startmin];
    NSNumber *endhour1 = [NSNumber numberWithInteger:(int)endhour];
    NSNumber *endmin1 = [NSNumber numberWithInteger:(int)endmin];
    [temp addObject:day];
    [temp addObject:starthour1];
    [temp addObject:startmin1];
    [temp addObject:endhour1];
    [temp addObject:endmin1];
    [results addObject:temp];
}

Это дает мне доступ к каждой записи.Мой мыслительный процесс говорит, что я мог бы решить эту проблему, пройдя каждую запись и заполнив требуемый массив как «i» - день, затем запустив цикл nest для каждой записи и извлекая часы и минуты?

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Я работал с желаемым выводом, но код выглядит неопрятно, его можно сделать элегантным.

` NSMutableArray *elementArray =[[NSMutableArray alloc ]init];
    NSMutableArray *results =[[NSMutableArray alloc ]init];
    NSInteger starthour = 0 ;
    NSInteger startmin = 0 ;
    NSInteger endhour = 0 ;
    NSInteger endmin = 0 ;

    NSNumber *starthour1 ;
    NSNumber *startmin1  ;
    NSNumber *endhour1 ;
    NSNumber *endmin1 ;
    NSMutableArray *temp = [[NSMutableArray alloc]init];
    NSString *string;
    int i = 0;
    for ( i = 0; i <=6; i ++){
        string = [NSString stringWithFormat:@"%d",i];
        elementArray =[Obj.obj valueForKey:string];
        starthour = [[elementArray objectAtIndex:1]integerValue];
        startmin =([[elementArray objectAtIndex:1]floatValue]-[[elementArray objectAtIndex:1]integerValue])*100;
        endhour = [[elementArray objectAtIndex:2]integerValue];
        endmin =([[elementArray objectAtIndex:2]floatValue]-[[elementArray objectAtIndex:2]integerValue])*100;
        NSNumber *day = [NSNumber numberWithInteger:[string integerValue]];
           starthour1 = [NSNumber numberWithInteger:(int)starthour];
           startmin1 = [NSNumber numberWithInteger:(int)startmin];
           endhour1 = [NSNumber numberWithInteger:(int)endhour];
           endmin1 = [NSNumber numberWithInteger:(int)endmin];
        [temp addObject:day];
        [temp addObject:starthour1];
        [temp addObject:startmin1];
        [temp addObject:endhour1];
        [temp addObject:endmin1];
        [results addObject:[temp copy]];



        [temp removeAllObjects];

        starthour = [[elementArray objectAtIndex:3]integerValue];
        startmin =([[elementArray objectAtIndex:3]floatValue]-[[elementArray objectAtIndex:3]integerValue])*100;
        endhour = [[elementArray objectAtIndex:4]integerValue];
        endmin =([[elementArray objectAtIndex:4]floatValue]-[[elementArray objectAtIndex:4]integerValue])*100;

        starthour1 = [NSNumber numberWithInteger:(int)starthour];
        startmin1 = [NSNumber numberWithInteger:(int)startmin];
        endhour1 = [NSNumber numberWithInteger:(int)endhour];
        endmin1 = [NSNumber numberWithInteger:(int)endmin];
        [temp addObject:day];
        [temp addObject:starthour1];
        [temp addObject:startmin1];
        [temp addObject:endhour1];
        [temp addObject:endmin1];
        [results addObject:[temp copy]];



        [temp removeAllObjects];
        starthour = [[elementArray objectAtIndex:5]integerValue];
        startmin =([[elementArray objectAtIndex:5]floatValue]-[[elementArray objectAtIndex:5]integerValue])*100;
        endhour = [[elementArray objectAtIndex:6]integerValue];
        endmin =([[elementArray objectAtIndex:6]floatValue]-[[elementArray objectAtIndex:6]integerValue])*100;

        starthour1 = [NSNumber numberWithInteger:(int)starthour];
        startmin1 = [NSNumber numberWithInteger:(int)startmin];
        endhour1 = [NSNumber numberWithInteger:(int)endhour];
        endmin1 = [NSNumber numberWithInteger:(int)endmin];
        [temp addObject:day];
        [temp addObject:starthour1];
        [temp addObject:startmin1];
        [temp addObject:endhour1];
        [temp addObject:endmin1];
        [results addObject:[temp copy]];



        [temp removeAllObjects];
`

Вывод - это то, что я хотел, выглядит ниже.

((0, 7, 0, 8, 59), (0, 15, 0, 16, 59), (0, 19, 0, 20, 59), (1, 7, 0, 8, 59), (1, 15, 0, 16, 59), (1, 22, 0, 23, 59), (2, 7, 0, 8, 59), (2, 15, 0, 16, 59), (2, 19, 0, 20, 59), (3, 7, 0, 8, 59), (3, 15, 0, 16, 59), (3, 22, 0, 23, 59), (4, 7, 0, 8, 59), (4, 15, 0, 16, 59), (4, 19, 0, 20, 59), (5, 7, 0, 8, 59), (5, 15, 0, 16, 59), (5, 22, 0, 23, 59), (6, 7, 0, 8, 59), (6, 15, 0, 16, 59), (6, 19, 0, 20, 59))

0 голосов
/ 13 октября 2018

Вы не говорите, какова ваша проблема на самом деле, то есть вы начали с решения, остановились и обратились к SO, почему?

Давайте посмотрим, сможем ли мы помочь вам вместе скакой-то псевдокод.

У вас есть словарь массивов.ключи представляют номера дней, как и первый элемент каждого массива.После первого элемента массива элементы идут парами, каждый из которых представляет собой строку, содержащую текстовое представление часов и минут, разделенных точкой.Вам нужен массив массивов, в котором каждый элемент имеет 5 членов: номер дня, начальный час, начальный мин, конечный час, конечная минута, все в виде чисел.

Основной алгоритм для обработки этого - два вложенных цикла.Вам нужно где-то сохранить результат:

results <- new empty array

Теперь вам нужно перебрать свой словарь:

for every key in sourceDictionary
   elementArray = sourceDictionary[key]

[Это цикл, который вы написали, кроме вассгенерировал ключи и посмотрел их, пока мы извлекаем ключи из словаря.Если вы хотите обработать ключи в определенном порядке, то сгенерируйте их в этом порядке или извлеките и отсортируйте их.]

Теперь вам лучше выполнить некоторую проверку данных, elementArray долженсодержит хотя бы номер дня и одну пару строк, проверьте это:

   check elementArray count > 1 and odd else handle error

Теперь вам нужно обработать каждую пару строк, сначала получить к ним доступ:

   cursor <- 1 // element 0 is the repeated day number
   while cursor < elementArray count do
      startTime <- elementArray[cursor]
      endTime <- elementArray[cursor+1]
      cursor <- cursor + 2 // ready for next iteration

Итак, теперь у вас есть номер дня key, а время начала и окончания в виде строки startTime & endTime.Теперь вам нужно разделить ваши строки времени на полную остановку, возвращая массив подстрок:

      startParts <- startTime split at "."

Больше проверок, вы получили две части?

      check startParts count is 2 else handle error

Теперь преобразуйте каждую подстрокув целое число:

      startHours <- parse startParts[0] as integer
      startMins <- parse startParts[1] as integer

И продолжайте проверять:

     check startHours in [0, 23] and startMins in [0, 59] else handle error

Теперь у вас есть пять значений, которые вы хотите, добавьте их в массив results:

     results <- results append array of (key, startHours, startMins, endHours, endMins)

Теперь просто конвертируйте это в Objective-C и заполните детали.Первый цикл может быть for in, второй - for(init; test; increment).Для разбиения строки посмотрите на методы NSString, каждый будет соответствовать требованиям.Для синтаксического анализа существует несколько опций, включая NSString методы.

HTH

...