Ios 从包含nsdictionary的nsmutablearray中删除重复项
我想从nsmutablearray中删除重复项 阵列结构:- 我想检查数组中包含任何具有相同act\u id的字典的位置。 如果是,则删除第一个字典。 i、 e上述阵列的预期结果为:-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_
(
{
"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);