我想在CNContacts
中找到重复的Array
:
代码:
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
,请将Array
添加到NSDictionary
(其中的密钥)是联系人姓名,对象是NSDictionary
,其中包含CNContact
和bool&#34;已检查&#34;)..我知道有点乱。
*问题:我将在主阵列*
中获得重复项我们说 Contact1["bob", "07100"]
, Contact2["bob","07100"]
。当&#34; j&#34;循环将检查if Contact1 == Contact1
哪个为真,并跳过将对象添加到数组,然后检查Contact1 == Contact2
(假,然后它看到Contact2
是重复的并且广告到主数组)。在 i ++ 之后,它与Contact2
做同样的事情,这就是问题(如果不清楚,请尝试找出3个对象。)
尝试解决问题,假设重复的联系人是一个接一个,并使用了i = j
,但if Contact1 == Contact3
,Contact2
将从验证中获胜
知道如何解决这个问题吗?
答案 0 :(得分:2)
我想我会提出另一种方法来实现你正在尝试利用Swift的一些内置函数。关于此解决方案需要注意的一点是,它无法帮助您确定哪个是重复的,哪个是用户想要保留的联系人。这实际上是您的方法的问题,因为如果两个联系人具有相同的名称但不同的号码会发生什么?这就是为什么在我的解决方案中我将重复项分组,您(或您的用户)可以决定该怎么做。
获取所有全名的数组:
let fullNames = self.arr_allContacts.map(CNContactFormatter.stringFromContact($0, style: .FullName))
使该数组唯一
let uniqueArray = Array(Set(fullNames))
这是我将采取与您正在做的不同的步骤。我将构建一个数组数组,因为我认为它将到达你想去的地方。
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
我没有时间测试代码,但这应该会让你到那里。