Swift:在数组

时间:2015-12-07 20:07:24

标签: ios arrays swift

我想在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 == Contact3Contact2将从验证中获胜

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

1 个答案:

答案 0 :(得分:2)

我想我会提出另一种方法来实现你正在尝试利用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
    
  5. 我没有时间测试代码,但这应该会让你到那里。