Objective-C:从大型数据结构中有效地删除重复项

Objective-C: Remove duplicates efficiently from large data structures

我有一个对象包含一个NSNumbersindexes)的数组和一个NSDictionariesindexesTitles)的数组对应于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 更改为 NSMutableDictionaryresultId 映射到 indexDictionary 值。

HTH