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中,我将重复组合在一起,而您(或您的用户)可以决定要做什么。
-
获取所有全名的数组:
let fullNames = self.arr_allContacts.map(CNContactFormatter.stringFromContact($0, style: .FullName))
-
使该数组唯一
let uniqueArray = Array(Set(fullNames))
-
这将是我将与你所做的不同的一步。 我将build立一个数组的arrays,因为我认为它会到达你想去的地方。
var contactGroupedByUnique = [Array]() for (fullName in uniqueArray) { var group = self.arr_allContacts.filter { CNContactFormatter.stringFromContact($0, style: .FullName) == fullName } contactGroupedByUnique.append(group) }
-
现在您可以执行以下操作:
contactGroupedByUnique.count = //number of unique contact contactGroupedByUnique[index] = //number of duplicates of that contact
我没有时间来testing代码,但是这应该会让你在那里。