已检查重复对象的NSDictionary

时间:2015-11-21 12:53:05

标签: ios objective-c nsdictionary key-value

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

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

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

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方法只计算其元素的数量。我知道@“约翰史密斯”和@“史密斯约翰”是一个,因为他的电子邮件是一样的。但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”

2 个答案:

答案 0 :(得分:1)

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

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

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;

答案 1 :(得分:0)

我认为您应该在此过程的早期检查重复的电子邮件,即在创建或添加此信息时。

这是漫长的啰嗦,但我认为最好的解释是如何实现您当前的数据结构所要求的。

NSMutableArray *names = [[NSMutableArray alloc] initWithObjects:
                         @"John Smith",
                         @"Lara Croft",
                         @"Smith John",
                         @"James Bond", nil];

NSMutableArray *emails = [[NSMutableArray alloc] initWithObjects:
                          @"john.smith@email.com",
                          @"lara.croft@email.com",
                          @"john.smith@email.com",
                          @"james.bond@email.com", nil];


NSMutableArray *nestedArray = [[NSMutableArray alloc] initWithObjects:names,emails, nil];

NSMutableArray *tmp = [[NSMutableArray alloc] init];
NSMutableArray *foo = [[NSMutableArray alloc] init];
NSMutableArray *bar = [[NSMutableArray alloc] init];

int count = 0;

for (NSString *string in [nestedArray objectAtIndex:1]) {

    if ([tmp containsObject:string]) {

        //object already exists in our array

        [bar addObject:string];
        [foo addObject:[[nestedArray objectAtIndex:0] objectAtIndex:count]];
        NSLog(@"Adding key to bar: %@ \n foo: %@",bar,foo);

        // use count to access the name associated with the email [[nestedArray objectAtIndex:0] objectAtIndex:count];

    }else{

        //add object as it doesnt exist in our array

        [tmp addObject:string];

        NSLog(@"Adding key to foo: %@",tmp);

    }

    count++;
}

NSLog(@"foo: %@ \n bar: %@",foo,bar);

我仍然建议您创建一个NSObject来优化数据管理。

栏会为您提供重复的密钥。

foo会告诉你你的名字。