我正在寻找一种结构,如NSDictionary作为键对象,但也有一种计算重复对象并通过键定义这些重复的方法。我尝试NSCountedSet,但是该课程没有对key-object
Foundation上是否有任何可用的结构类型,或者我必须构建自己的结构?

.....详细更新问题:

我寻找重复联系人的结构,可以在他们的电子邮件中找到,因为这是唯一的,尽管有他们的名字,但全名可能有所不同,例如:

NSMutableDictionary* listContacts = [[NSMutableDictionary alloc] init];
[listContact setObject:@”john.smith@email.com” forKey:@”john Smith”];
[listContact setObject:@”lara.croft@email.com” forKey:@”lara Croft”];
[listContact setObject:@”john.smith@email.com” forKey:@” Smith John”];
[listContact setObject:@”james.bond@email.com” forKey:@”James bond”];


NSDictionary的count方法仅计算其元素的数量。我知道@“ John Smith”和@“ Smith John”是一个,因为他的电子邮件是相同的。但是NSDictionary没有办法在对象@@ john.smith @ email.com上找到重复项。我尝试将NSCountedSet设置为:

NSMutableArray* email = @[@”john.smith@email.com”, @”lara.croft@email.com”, @”john.smith@email.com”, @”james.bond@email.com”];
NSCountedSet* duplicateContacts = [[NSCountedSet alloc] initWithArray:email];
for (NSNumber *num in duplicateContacts)
{
    if ([duplicateContacts countForObject:num]>1)
       {
NSLog(@"duplicated %lu time of %@",[findDuplicate countForObject:num],num);
      }
}


它仅找到重复的电子邮件,没有相关名称。

如果我将NSDictionary的结构尝试为:

NSMutableDictionary* listContacts = [[NSMutableDictionary alloc] init];
[listContact setObject: @”john Smith”  forKey: @”john.smith@email.com”];
[listContact setObject: @”lara Croft”   forKey: @”lara.croft@email.com”];
[listContact setObject: @” Smith John”  forKey: @”john.smith@email.com”];
[listContact setObject: @”James bond”  forKey: @”james.bond@email.com”];


NSDictionary将静默删除添加的重复密钥,而该NSDictionary的结果仅保留为:

Object: @”lara Croft” Key: @”lara.croft@email.com”;
Object: @” Smith John” Key: @”john.smith@email.com”;
Object: @”James bond” Key: @”james.bond@email.com”;


对象:@“ john Smith”密钥:@“ john.smith@email.com”由于重复的密钥:@“ john.smith@email.com”而被删除

最佳答案

我只是创建一个数组字典。密钥将是电子邮件地址,值将是联系人/姓名的数组。每个键的计数只是其值的计数(数组中元素的数量)。

您可以使用以下算法构造它:

NSArray *contacts = ...;
NSMutableDictionary *keyedEmails = [NSMutableDictionary dictionary];

for (Contact *contact in contacts) {
    NSMutableArray *contactsForEmail = keyedEmails[contact.email];
    if (contactsForEmail = nil) {
        contactsForEmail = [NSMutableArray array];
        keyedEmails[contact.email] = contactsForEmail;
    }

    [contactsForEmail addObject:contact];
}


您甚至可以使用简单的语法获取任何电子邮件的计数:

NSUInteger countForEmail = keyedEmails[email].count;

关于ios - NSDictionary已检查重复对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33843571/

10-12 14:59
查看更多