2013-10-08 74 views
-1

我有一个JSON结果在NSmutableArray与Dictionarys,我想知道如何迭代和比较相同的键值(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中保存相同的值,以使用主引脚创建群集注释 – 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

同意 - 但我不想过分复杂的答案 - 他会从JSON获取NSArray - 所以我以最直接的方式回答了我可以提出的问题。请随时将其更改为NSSet并发布您的答案。我敢打赌,我的代码使得所有对象的循环少于使用NSSet方法的循环:D –

+0

这不是循环次数。在一个集合中找到一个项目是O(log(n)),在一个数组中找到它是O(n)。不仅如此,实现您自己的搜索缺乏可读性 – JuJoDi