Objective-C:从大型数据结构中有效地删除重复项
Objective-C: Remove duplicates efficiently from large data structures
我有一个对象包含一个NSNumbers
(indexes
)的数组和一个NSDictionaries
(indexesTitles
)的数组对应于indexes
,包含一些信息。
我必须为每个 object.index
调用一个方法并将 object.indexTitles
关联到返回结果,将它们保存到一个数组中。
最后,我想删除重复的索引,以有效的方式保留关联的 indextTitles
,因为我正在处理大型数组。
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 像这样:
NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:resultArray];
resultArray = [orderedSet.array mutableCopy];
如何删除 titlesArray
中的相应条目?我怎样才能保持协会?
我也尝试过使用 NSDictionary
之类的 {resultId, titleDictionary}
并将它们存储到一个数组中,但是我还没有找到一种有效的方法来删除具有相同 result
的字典,它们都是太慢了。
有什么建议吗?
我不太清楚你的问题是什么,也许这会有所帮助:
删除重复项的一个好方法是一开始就不要添加它们,替换为:
for(NSNumber *resultId in resultsIndexArray)
{
[titlesArray addObject:indexDictionary];
[resultArray addObject:resultId];
}
与:
for(NSNumber *resultId in resultsIndexArray)
{
// only add if resultId not already in resultArray
if( ![resultArray containsObject:resultId] )
{
[titlesArray addObject:indexDictionary];
[resultArray addObject:resultId];
}
}
containsObject:
调用需要线性搜索,如果您的数据集很大,您可能希望将 resultArray
更改为 NSMutableSet
并将 titlesArray
更改为 NSMutableDictionary
从 resultId
映射到 indexDictionary
值。
HTH
我有一个对象包含一个NSNumbers
(indexes
)的数组和一个NSDictionaries
(indexesTitles
)的数组对应于indexes
,包含一些信息。
我必须为每个 object.index
调用一个方法并将 object.indexTitles
关联到返回结果,将它们保存到一个数组中。
最后,我想删除重复的索引,以有效的方式保留关联的 indextTitles
,因为我正在处理大型数组。
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 像这样:
NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:resultArray];
resultArray = [orderedSet.array mutableCopy];
如何删除 titlesArray
中的相应条目?我怎样才能保持协会?
我也尝试过使用 NSDictionary
之类的 {resultId, titleDictionary}
并将它们存储到一个数组中,但是我还没有找到一种有效的方法来删除具有相同 result
的字典,它们都是太慢了。
有什么建议吗?
我不太清楚你的问题是什么,也许这会有所帮助:
删除重复项的一个好方法是一开始就不要添加它们,替换为:
for(NSNumber *resultId in resultsIndexArray)
{
[titlesArray addObject:indexDictionary];
[resultArray addObject:resultId];
}
与:
for(NSNumber *resultId in resultsIndexArray)
{
// only add if resultId not already in resultArray
if( ![resultArray containsObject:resultId] )
{
[titlesArray addObject:indexDictionary];
[resultArray addObject:resultId];
}
}
containsObject:
调用需要线性搜索,如果您的数据集很大,您可能希望将 resultArray
更改为 NSMutableSet
并将 titlesArray
更改为 NSMutableDictionary
从 resultId
映射到 indexDictionary
值。
HTH