代码之家  ›  专栏  ›  技术社区  ›  Yupi

改进两个阵列的比较swift

  •  0
  • Yupi  · 技术社区  · 6 年前

    我有一个应用程序,用户可以点击其他用户配置文件,而应用程序将比较两个用户的电话联系人和搜索普通联系人。这是可行的,但它消耗了很多时间,所以我想知道是否有一种方法可以至少加快一点。

    ****请注意,我是iOS开发的初学者,但仍不太熟悉 Swift 语法和一般的iOS,所以任何帮助都会非常感谢

    这是我的单曲 Contact 班级:

    class Contact: Hashable, Equatable {
      var hashValue: Int { get { return phoneNumber!.hashValue } }
      var name: String?
      var phoneNumber: String?
      var thumbnail: Data?
      var filled: Bool?
    
      init() {
      }
    
      init(name: String?, phoneNumber: String?, thumbnail: Data?) {
        self.name = name
        self.phoneNumber = phoneNumber
        self.thumbnail = thumbnail
    }
    static func ==(lhs: Contact, rhs: Contact) -> Bool {
        return lhs.phoneNumber == rhs.phoneNumber
      }
    }
    

    我已经实施了,正如你所看到的, Hashable Equatable 用于按电话号码比较联系人并删除重复项。下面是我执行比较主操作的代码。 contacts 数组包含用户和的电话联系人 otherContacts

                    for result in self.contacts {
                    if self.otherContacts.contains(result){
                        self.commonContacts.append(result)
                    }
                }
                self.removedDuplicates = Array(Set(self.commonContacts))
                if self.removedDuplicates.count == 1 {
                    self.commonFriends.text = "\(1) common friend"
                }
                else {
                    self.commonFriends.text = "\(self.removedDuplicates.count) common friends"
                }
    

    谢谢。

    3 回复  |  直到 6 年前
        1
  •  2
  •   Duncan C    6 年前

    O(n) O(n^2)

    Set contains(_:)

        2
  •  2
  •   Schemetrical Karthi Keyan    6 年前
        3
  •  1
  •   Fabian    6 年前

    Dictionary

    var commonContacts = Dictionary(uniqueKeysWithValues: contacts.lazy.map{ return ($0.phoneNumber!, $0) })
        .merge(otherContacts.lazy.map{ ($0.phoneNumber!, $0) }, uniquingKeysWith: {
            contact1, _ in contact1 // Can do merging of duplicates here.
        })