Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从包含nsdictionary的nsmutablearray中删除重复项_Ios_Nsmutablearray_Nsmutabledictionary - Fatal编程技术网

Ios 从包含nsdictionary的nsmutablearray中删除重复项

Ios 从包含nsdictionary的nsmutablearray中删除重复项,ios,nsmutablearray,nsmutabledictionary,Ios,Nsmutablearray,Nsmutabledictionary,我想从nsmutablearray中删除重复项 阵列结构:- 我想检查数组中包含任何具有相同act\u id的字典的位置。 如果是,则删除第一个字典。 i、 e上述阵列的预期结果为:- ( { "act_end_date" = ""; "act_entry_date" = "13/11/2014"; "act_recurrrance_type" = Daily; "act_start_

我想从nsmutablearray中删除重复项

阵列结构:-

我想检查数组中包含任何具有相同act\u id的字典的位置。 如果是,则删除第一个字典。 i、 e上述阵列的预期结果为:-

(
        {
            "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" = 1;
        "act_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而不是数组


germanMakes是您的初始数组,Keyset包含唯一的act_id(例如,1,2,3,4..),filteredArray是按act_id过滤的数组。请记住,这不会按升序排序,但这一部分很容易。

这就是为什么创建自定义模型对象如此有价值的原因。在这种情况下,您可以覆盖
isEqual
,并将对象放入一个集合中,以移除重复。过度使用字典意味着代码比需要的复杂得多。你想让row_id=1表示副本中的最新id吗?没有for循环是可能的?我不认为。即使有任何内置方法,该方法中也必须有一个内部循环。顺便说一句,为什么不循环?@Shoaib嗨,我尝试了你的第一个解决方案,但由于未捕获的异常“NSUnknownKeyException”,出现了如下错误
终止应用程序,原因:“[valueForUndefinedKey::]:该类不符合密钥_id的键值编码要求。
@DavidJonker请确保使用了有效的密钥名。
(
    {
        "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;
    }
)
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];
    }
}
//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);