2014-11-13 1 views
1

Я хочу удалить дубликаты из nsmutablearray.Удалить дубликат из nsmutablearray, содержащий nsdictionary

Массив Структура: -

(
    { 
     "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 означает последний идентификатор в дубликатах –

ответ

2

Предполагая, что вы хотите последний объект, который будет в списке.

Решение 1: (Simple)

Reverse ваш массив

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; 
} 
+1

можно без цикла? –

+0

Не думаю. если даже есть встроенный метод, в этом методе должен быть внутренний цикл. Кстати, почему не петля? – Shoaib

+0

@Shoaib Привет, я пробовал с вашим первым решением, но это ошибка, подобная этому «Завершение приложения из-за неотображенного исключения» NSUnknownKeyException », причина:« [<_SwiftValue 0x618000441680> valueForUndefinedKey:]: этот класс не является ключевым значением, совместимым с кодировкой для ключ _id.'' –

5
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); 

germanMakes является ваш первоначальный массив, keysSet содержит уникальный act_id (например, 1,2,3,4 ..), filteredArray ваш массив фильтруется act_id. Имейте в виду, что это не сортируется по возрастанию, но эта часть будет легкой.