Ios 目标C:高效地从大型数据结构中删除重复项
我有一个对象,其中包含一个Ios 目标C:高效地从大型数据结构中删除重复项,ios,objective-c,nsarray,duplicate-removal,nsorderedset,Ios,Objective C,Nsarray,Duplicate Removal,Nsorderedset,我有一个对象,其中包含一个NSNumbers(索引)数组和一个nsdictionary(索引)数组,对应于索引,包含一些信息。 我必须为每个object.index调用一个方法,并将object.indexTitles与返回的结果关联起来,将它们保存到单个数组中。 最后,我希望删除重复的索引,以有效的方式保留关联的indextitles,因为我使用的是大型数组 NSMutableArray *resultArray = [NSMutableArray array]; NSMutableArray
NSNumbers
(索引
)数组和一个nsdictionary
(索引
)数组,对应于索引,包含一些信息。
我必须为每个object.index
调用一个方法,并将object.indexTitles
与返回的结果关联起来,将它们保存到单个数组中。
最后,我希望删除重复的索引,以有效的方式保留关联的indextitles
,因为我使用的是大型数组
NSMutableArray *resultArray = [NSMutableArray array];
NSMutableArray *titlesArray = [NSMutableArray array];
for(NSNumber *index in object.indexes)
{
NSArray *resultsIndexArray = [self methodThatReturnsAnArray];
NSString *indexTitleDictionary = [object.indexesTitles objectAtIndex:i];
for(NSNumber *resultId in resultsIndexArray)
{
[titlesArray addObject:indexDictionary];
[resultArray addObject:resultId];
}
i++;
}
[fullResultsArray addObject:titlesArray];
[fullResultsArray addObject:resultArray];
我发现删除重复项的最有效方法是使用
如下所示的数据集:
NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:resultArray];
resultArray = [orderedSet.array mutableCopy];
如何删除标题数组中的相应条目?我怎样才能保持这种联系?
我也尝试过使用NSDictionary
如{resultId,titleDictionary}
并将它们存储到一个数组中,但我没有找到一种有效的方法来删除具有相同结果的字典,它们都太慢了
有什么建议吗?我不完全清楚您的问题是什么,也许这会有帮助:
删除重复项的一个好方法不是首先添加它们,而是替换:
for(NSNumber *resultId in resultsIndexArray)
{
[titlesArray addObject:indexDictionary];
[resultArray addObject:resultId];
}
与:
containsObject:
调用需要线性搜索,如果您的数据集很大,您可能希望将resultArray
更改为NSMutableSet
并将titlesray
更改为NSMutableDictionary
从resultId
映射到indexDictionary
值
HTH使用NSMutableSet
而不是NSMutableArray
来消除重复项。您能用一些细节来扩展您的评论吗?谢谢@CRD,我正在尝试您的第二种解决方案,问题是NSMutableDictionary中的{resultId,indexDictionary}我正在获取indexDictionary的最后一个值,我需要第一个匹配项,如何处理它?已解决,我刚刚添加了if(![TitleDictionary objectForKey:resultId]),然后为键设置对象。
for(NSNumber *resultId in resultsIndexArray)
{
// only add if resultId not already in resultArray
if( ![resultArray containsObject:resultId] )
{
[titlesArray addObject:indexDictionary];
[resultArray addObject:resultId];
}
}