2013-10-08 2 views
-1

사전과 함께 NSmutableArray로 구성된 JSON 결과가 있고 동일한 키 값 (예 : id_sucursal)을 반복하고 비교하여 Array에 저장하여 클러스터 주석을 만듭니다. . 다음은 JSON 결과입니다 :NSDictionary의 동일한 키 값 비교

사용 예를 들어, 목표 C 구조에 JSON을 변경 한 후
{ 
    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 개체를 배열에서 다음 NSArray NSArray 대신 사용하는 것이 좋습니다.

NSSet에 고유 한 객체 만 추가하는 데 도움이됩니다. 매우 쉽게 쓸 수 있으며 아래 링크는 내가 NSMutableSet를 사용하여 이러한 경우를 해결하기 때문에 당신이 원하는 무언가이다 :

NSSet Tutorial

0

:

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

동의 함 -하지만 답을 너무 복잡하게 만들고 싶지는 않습니다. JSArt에서 NSArray를 얻을 것입니다. 그래서 가장 곧바로 사용할 수있는 버전으로 대답했습니다. NSSet으로 바꾸고 대답을 게시하십시오. 내 코드는 NSSet 접근 방식보다 모든 객체가 적은 루프를 만들 수 있다고 확신합니다 : D –

+0

루프 수는 아닙니다. 집합에서 항목을 찾는 것은 O (log (n))이며, 배열에서 항목을 찾는 것은 O (n)입니다. 뿐만 아니라 독자적인 검색을 구현하는 것은 가독성이 부족합니다. – JuJoDi