Swift:在数组中find重复的CNContact对象

我想在一个Array获得重复的CNContacts

码:

  func fetchDuplicateContacts(){ self.didFinished_getDuplicateContacts = false; self.arr_duplicateContacts.removeAllObjects() NSLog("Start fetch duplicate", "") self.duplicateContactsCount = 0; for (var i: Int = 0; i < self.arr_allContacts.count; i++){ let contact1 = self.arr_allContacts[i] var hasDuplicate: Bool = false let arr_childs: NSMutableArray = NSMutableArray() for (var j: Int = 0; j < self.arr_allContacts.count; j++){ let contact2 = self.arr_allContacts[j] if(contact1 != contact2){ if CNContactFormatter.stringFromContact(contact1, style: .FullName) == CNContactFormatter.stringFromContact(contact2, style: .FullName){ if(self.checkIfContactsHaveSamePhones(contact1, contact2: contact2)){ print("Move on cuz duplicate: \(CNContactFormatter.stringFromContact(contact1, style: .FullName))") duplicateContactsCount += 1; arr_childs.addObject(NSDictionary(objects: [contact2, false], forKeys: ["object", "checked"])) hasDuplicate = true } } } } // This is for adding first contact to main array to be the first. It's important to be like this if hasDuplicate == true{ arr_childs.insertObject(NSDictionary(objects: [contact1, false], forKeys: ["object", "checked"]), atIndex: 0) var key: NSString? = CNContactFormatter.stringFromContact(contact1, style: .FullName) if key == nil { key = "no name \(i)" } arr_duplicateContacts.addObject([key! : arr_childs]) } } NSLog("End fetch duplicate w results \(self.duplicateContactsCount)", "") self.didFinished_getDuplicateContacts = true; dispatch_async(dispatch_get_main_queue(), { () -> Void in self.mytable.reloadData() }) } 

我循环槽array ,检查每个2个联系人,如果有相同的名称和相同的数字,如果是true ,将它们添加到一个NSDictionary Array (其关键是联系人的名称,对象是一个NSDictionary包含CNContact和一个布尔“检查”)有点混乱,我知道。

*问题:我会得到主数组内的重复*

假设我有Contact1["bob", "07100"]Contact2["bob","07100"] 。 当“j”循环将检查Contact1 == Contact2是否为真,并跳过添加对象到数组,然后检查Contact1 == Contact2 (false,然后它看到Contact2是重复的,广告到主数组)。 在i ++之后,它与Contact2做同样的事情, 这是问题 (如果不清楚,请尝试找出3个对象)。

试图通过假设重复的联系人一个接一个地使用i = j 解决它 ,但是if Contact1 == Contact3 ,Contact2将从validation中滑出

任何想法如何解决这个问题?

我想我会提出另一种方法来实现你正在试图利用Swift的一些内置函数。 有一点需要注意的是,这个解决scheme不能帮助你确定哪个是重复的,哪个是用户想要保留的联系人。 这实际上是你的方法的问题,因为如果两个联系人有相同的名字,但是不同的号码会发生什么? 这就是为什么在我的解决scheme中,我将重复组合在一起,而您(或您的用户)可以决定要做什么。

  1. 获取所有全名的数组:

     let fullNames = self.arr_allContacts.map(CNContactFormatter.stringFromContact($0, style: .FullName)) 
  2. 使该数组唯一

     let uniqueArray = Array(Set(fullNames)) 
  3. 这将是我将与你所做的不同的一步。 我将build立一个数组的arrays,因为我认为它会到达你想去的地方。

     var contactGroupedByUnique = [Array]() for (fullName in uniqueArray) { var group = self.arr_allContacts.filter { CNContactFormatter.stringFromContact($0, style: .FullName) == fullName } contactGroupedByUnique.append(group) } 
  4. 现在您可以执行以下操作:

     contactGroupedByUnique.count = //number of unique contact contactGroupedByUnique[index] = //number of duplicates of that contact 

我没有时间来testing代码,但是这应该会让你在那里。