2014-11-13 2 views
1

nsmutablearray에서 중복을 제거하고 싶습니다.nsdictionary를 포함하는 nsmutablearray에서 중복을 제거하십시오.

배열 구조 : -

(
    { 
     "act_end_date" = ""; 
     "act_entry_date" = "13/11/2014"; 
     "act_recurrrance_type" = Daily; 
     "act_start_date" = "2014-11-13"; 
     "row_id" = 0; 
     "act_id" = 2; 
    } 
    { 
     "act_end_date" = ""; 
     "act_entry_date" = "13/11/2014"; 
     "act_recurrrance_type" = Daily; 
     "act_start_date" = "2014-11-13"; 
     "row_id" = 1; 
     "act_id" = 2; 
    } 
    { 
     "act_end_date" = ""; 
     "act_entry_date" = "16/11/2014"; 
     "act_recurrrance_type" = Daily1; 
     "act_start_date" = "2014-11-15"; 
     "row_id" = 2; 
     "act_id" = 3; 
    } 
) 

내가 원하는 배열이 같은 act_id이있는 모든 사전을 포함 할 경우 확인하는 것입니다. 예이면 1 번째 사전을 삭제하십시오. 위의 arrayis에 대한 예상 결과 즉 : - 자신의 방법이

(
     { 
      "act_end_date" = ""; 
      "act_entry_date" = "13/11/2014"; 
      "act_recurrrance_type" = Daily; 
      "act_start_date" = "2014-11-13"; 
      "row_id" = 1; 
      "act_id" = 2; 
     } 
     { 
      "act_end_date" = ""; 
      "act_entry_date" = "16/11/2014"; 
      "act_recurrrance_type" = Daily1; 
      "act_start_date" = "2014-11-15"; 
      "row_id" = 2; 
      "act_id" = 3; 
     } 
    ) 

인가? NSPREDICATE를 사용하면 가능합니까?

나는 아래의 방법으로 그것을 할 시도 : -

NSMutableArray *filteredArray = [NSMutableArray array]; 

    for (NSMutableDictionary* E1 in Event_Array) 
    { 

     BOOL hasDuplicate = [[filteredArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"act_id == %@", [E1 objectForKey:@"act_id"]]] count] > 0; 

     if (!hasDuplicate) 
     { 
      [filteredArray addObject:E1]; 
     } 
    } 

가 배열이 반환의 경우 : 당신이 원하는 가정 --- 내가 원하는 무엇

(
    { 
     "act_end_date" = ""; 
     "act_entry_date" = "13/11/2014"; 
     "act_recurrrance_type" = Daily; 
     "act_start_date" = "2014-11-13"; 
     "row_id" = 0; 
     "act_id" = 2; 
    } 
) 

(
    { 
     "act_end_date" = ""; 
     "act_entry_date" = "13/11/2014"; 
     "act_recurrrance_type" = Daily; 
     "act_start_date" = "2014-11-13"; 
     "row_id" = 1; 
     "act_id" = 2; 
    } 
) 
+0

이 때문에 맞춤 모델 개체를 만드는 것이 중요합니다. 이 경우에는 'isEqual'을 덮어 쓰고 객체를 집합에 넣어 중복을 제거 할 수 있습니다. 사전을 과도하게 사용하면 코드가 필요한 것보다 훨씬 복잡해집니다. – trojanfoe

+0

원하는 row_id = 1은 중복 ID가 –

답변

2

한다 목록에있는 최신 객체.

해결 방법 1 :

이 배열

NSMutableArray *filteredArray = [NSMutableArray array]; 
for (int i = Event_Array.count-1; i>= 0; i--) 
{ 
    NSMutableDictionary* E1 = [Event_Array objectAtIndex:i]; 
    BOOL hasDuplicate = [[filteredArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"act_id == %@", [E1 objectForKey:@"act_id"]]] count] > 0; 

    if (!hasDuplicate) 
    { 
     [filteredArray addObject:E1]; 
    } 
} 

해결 방법 2 역

(단순) :

사용 NSMutableDictionary 대신 배열입니다.

//Keys are act_id(s) 
"2" = { 
    "act_end_date" = ""; 
    "act_entry_date" = "13/11/2014"; 
    "act_recurrrance_type" = Daily; 
    "act_start_date" = "2014-11-13"; 
    "row_id" = 1; 
    "act_id" = 2; 
}; 
"3" = { 
    "act_end_date" = ""; 
    "act_entry_date" = "16/11/2014"; 
    "act_recurrrance_type" = Daily1; 
    "act_start_date" = "2014-11-15"; 
    "row_id" = 2; 
    "act_id" = 3; 
} 
NSMutableSet *keysSet = [[NSMutableSet alloc] init]; 
    NSMutableArray *filteredArray = [[NSMutableArray alloc]init]; 
    for (NSDictionary *msg in germanMakes) { 
    NSString *key = [NSString stringWithFormat:@"%@", msg[@"act_id"]]; 
    if (![keysSet containsObject:key]) { 
     [filteredArray addObject:msg]; 
     [keysSet addObject:key]; 
    } 
    } 
    NSLog(@"filteredResults %@ keyset%@",filteredArray , keysSet); 
+1

인 최신 ID를 의미합니다. for 루프없이 가능합니까? –

+0

나는 생각하지 않는다. 심지어 기본 제공 메서드가 있으면 해당 메서드에 내부 루프가 있어야합니다. 왜, 루프하지? – Shoaib

+0

@Shoaib 안녕하세요, 첫 번째 솔루션을 사용해 보았지만 '캡쳐되지 않은 예외'NSUnknownKeyException '으로 인해 앱 종료 중 오류가 발생했습니다. 이유는 다음과 같습니다.'[<_SwiftValue 0x618000441680> valueForUndefinedKey :] :이 클래스는 key _id. '' –

5

germanMakes (예 1,2,3,4 ...)이,이 filteredArray act_id 필터링 배열이다 초기 배열, keysSet 고유 act_id 포함한다. 이것이 오름차순으로 정렬되지 않는다는 것을 명심하십시오. 그러나 그 부분은 쉬울 것입니다.

관련 문제