2013-10-08 108 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