2013-10-08 3 views
-1

У меня есть результат JSON, который состоит из NSmutableArray с словарями, и я хочу знать, как перебирать и сравнивать идентичные значения ключа (id_sucursal в моем случае) и сохранять его в массиве для создания аннотации кластера , Ниже приведен результат JSON:Сравнение идентичных значений ключа в NSDictionary

{ 
    ancla = 1; 
    categoria = 12; 
    descripcion = "Gur\U00fa Ofertas te trae un 15% de descuento* en todos los platos o un postre* de cortes\U00eda en el Centro Cultural Mediterr\U00e1neo La Gloria"; 
    descuento = 16; 
    "id_cupon" = 540; 
    "id_sucursal" = 45; 
    lat = "4.63323"; 
    lon = "-74.144474"; 
    premium = "<null>"; 
    rutaimagen = "ruta/imagen/14"; 
    tipooferta = "% Descuento"; 
    titulo = "Decoraciones del hogar Home Center"; 
    zona = 2; 
}, 
    { 
    ancla = "<null>"; 
    categoria = 4; 
    descripcion = "$50.000 en vez de $120.000 por noche romantica para dos personas. Incluye cena romantica+champa\U00f1a+acomodaci\U00f3n en cama doble"; 
    descuento = 61; 
    "id_cupon" = 536; 
    "id_sucursal" = 50; 
    lat = "4.669106"; 
    lon = "-74.043949"; 
    premium = 1; 
    rutaimagen = "ruta/imagen/7"; 
    tipooferta = "% Descuento"; 
    titulo = "Lavado de autos Splash"; 
    zona = 1; 
}, 
    { 
    ancla = "<null>"; 
    categoria = 3; 
    descripcion = "Durante el mes de septiembre lleva uno de nuestros colchones Elegance por tan solo $429.000. Precio normal: $858.000. Te lo llevamos hasta la puerta de tu casa \U00a1y no te cuesta m\U00e1s!"; 
    descuento = 51; 
    "id_cupon" = 537; 
    "id_sucursal" = 54; 
    lat = "4.655775"; 
    lon = "-74.099317"; 
    premium = 1; 
    rutaimagen = "ruta/imagen/11"; 
    tipooferta = "% Descuento"; 
    titulo = "Lavado de autos Splash"; 
    zona = 1; 
}, 
    { 
    ancla = "<null>"; 
    categoria = 4; 
    descripcion = "$240.0000 en ves de $480.000 por 3 dias y 4 noche en el Hotel Hilton de Bogot\U00e1 en acomodaci\U00f3n doble"; 
    descuento = 51; 
    "id_cupon" = 535; 
    "id_sucursal" = 45; 
    lat = "4.63323"; 
    lon = "-74.144474"; 
    premium = 1; 
    rutaimagen = "ruta/imagen/2"; 
    tipooferta = "% Descuento"; 
    titulo = "Lavado de autos Splash"; 
    zona = 1; 
} 
+1

Что вы хотите делать, если ключи идентичны? – JuJoDi

+0

не могли бы вы рассказать вам вопрос ... о сравнении и сохранении ценностей. –

+0

Я хочу сохранить одинаковые значения в NSMutableArray, чтобы создать аннотации кластеров с помощью kingpin – frank0ch0a

ответ

2

Если вы хотите уникальный NSDictionary объектов из массива, то я предлагаю вам использовать NSSet вместо NSArray.

Это поможет вам добавить только уникальные объекты в NSSet. Она очень проста в использовании и ниже ссылка, что вы хотите, потому что я решил такой случай, используя NSMutableSet:

NSSet Tutorial

0

После изменения JSON в Objective структуры C, например, с помощью:

NSArray *mainArray = [NSJSONSerialization JSONObjectWithData: [jsonString dataUsingEncoding:NSUTF8StringEncoding] options: NSJSONReadingMutableContainers error:nil]; 

Вы можете перебирать так:

NSMutableArray* duplicates = [NSMutableArray array]; //keeping duplicated entries 
NSMutableArray* uniques = [NSMutableArray array]; //to keep track on which ids where visited 

for (NSDictionary* dict in mainArray) 
{ 
    NSNumber* id_sucursal = [dict objectForKey:@"id_sucursal"]; //get id of current element 
    BOOL isDuplicated = NO; 

    for (NSNumber* uniqueId in uniques) //for all visited ids 
    { 
     if([id_sucursal isEqualToNumber:uniqueId]) //if same id was already found before 
     { 
      isDuplicated = YES; 
      break; 
     } 
    } 

    if(isDuplicated) 
    { 
     [duplicates addObject:dict]; //add element to duplicated list 
    } 
    else 
    { 
     [uniques addObject:id_sucursal]; //add id to visited ids 
    } 
} 
+1

Это очень неэффективно. По крайней мере, вы должны использовать NSSet для проверки дубликатов. – JuJoDi

+0

Согласитесь - но я не хочу чрезмерно усложнять ответ - он получит NSArray от JSON, поэтому я ответил в самой прямой версии, с которой я мог бы придумать. PLease не стесняйтесь менять его на NSSet и публиковать свой ответ. Бьюсь об заклад, мой код делает меньше циклов, чем все объекты, чем вы собираетесь делать с вашим подходом NSSet: D –

+0

Речь идет не о числе циклов. Поиск элемента в наборе - это O (log (n)), нахождение его в массиве равно O (n). Мало того, что для реализации собственного поиска недостаточно читаемости – JuJoDi

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