gpt4 book ai didi

ios - Swift:在数组中查找重复的 CNContact 对象

转载 作者:搜寻专家 更新时间:2023-10-31 22:47:44 26 4
gpt4 key购买 nike

我正在尝试在 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()
})
}

我遍历数组,检查每两个联系人是否具有相同的姓名和相同的号码,如果为真,则将它们添加到数组 NSDictionary(其键是联系人姓名,对象是一个 NSDictionary,其中包含 CNContact 和一个 bool 值“checked”).. 一点点凌乱,我知道。

*问题:我会在主数组中得到重复项 *

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

尝试通过假设重复的联系人一个接一个地解决它并使用 i = j如果 Contact1 == Contact3Contact2 将跳过验证

知道如何解决这个问题吗?

最佳答案

我想我会提出另一种方法来利用 Swift 的一些内置函数来实现您正在尝试做的事情。关于此解决方案需要注意的一件事是,它不会帮助您确定哪些是重复的,哪些是用户想要保留的联系人。这实际上是您方法的一个问题,因为如果两个联系人的姓名相同但号码不同,会发生什么情况?这就是为什么在我的解决方案中我将重复项分组并且您(或您的用户)可以决定要做什么。

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

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

    let uniqueArray = Array(Set(fullNames))
  3. 这是我将做的与您正在做的不同的步骤。我会构建一个数组数组,因为我认为它会到达你想去的地方。

    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

我没有时间测试代码,但这应该可以帮助您。

关于ios - Swift:在数组中查找重复的 CNContact 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34142235/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com