如何比较两个对象数组?

Qua*_* Hà 12 arrays compare ios swift

我有一个A类:

class A {
   var identifier: String?
   var quantity: Int = 0
}
Run Code Online (Sandbox Code Playgroud)

两个A实例数组:

var array1: [A] = [a1, a2, a3, a4]
var array2: [A] = [a5, a6, a7, a8]
Run Code Online (Sandbox Code Playgroud)

我不知道哪种方法最好检查: array1==array2 if a1.identifier == a5.identifier, a2.identifier == a6.identifier, a3.identifier==a7.identifier, a4.identifier==a8.identifier在Swift中.

请帮我...

Rah*_*thi 25

你可以尝试这样:

let result = zip(array1, array2).enumerated().filter() {
    $1.0 == $1.1
}.map{$0.0}
Run Code Online (Sandbox Code Playgroud)

  • 如果此方法有效,则它看起来像是从某个地方复制粘贴的代码,没有任何代码解释!。@ Rahul Tripathi (2认同)
  • 这是一个错误的答案,因为通过此比较,[1,2,3] 等于 [1,2,3,4](zip 选择最短数组的长度) (2认同)

t4n*_*hpt 9

假设您的数据如下:

struct Person
    {
        let name: String
        let id:  Int
    }

    var people1 = [
        Person(name: "Quang Hà", id: 42),
        Person(name: "Lý H?i", id: 23),
        Person(name: "Maria", id: 99)
    ]

    var people2 = [
        Person(name: "Maria yyy", id: 99),
        Person(name: "Billy", id: 42),
        Person(name: "David", id: 23)
    ]
Run Code Online (Sandbox Code Playgroud)

这是比较具有id的两个人数组的方法:

func areArrayPeopleEqual(people1:[Person], people2: [Person]) -> Bool {
    var array1 = people1
    var array2 = people2

    // Don't equal size => false
    if array1.count != array2.count {
        return false
    }

    // sort two arrays
    array1.sortInPlace() { $0.id > $1.id }
    array2.sortInPlace() {$0.id > $1.id }

    // get count of the matched items
    let result = zip(array1, array2).enumerate().filter() {
        $1.0.id == $1.1.id
        }.count

    if result == array1.count {
        return true
    }

    return false
}
Run Code Online (Sandbox Code Playgroud)


Ana*_*and 5

斯威夫特4

以下方法使其变得更加容易。

方法1-使用平等协议

第一步-使您的班级“ A”等于

extension A: Equatable {
    static func ==(lhs: A, rhs: A) -> Bool {
        // Using "identifier" property for comparison
        return lhs.identifier == rhs.identifier
    }
}
Run Code Online (Sandbox Code Playgroud)

第2步-按升序或降序对数组进行排序

let lhsArray = array1.sorted(by: { $0.identifier < $1.identifier })
let rhsArray = array2.sorted(by: { $0.identifier < $1.identifier })
Run Code Online (Sandbox Code Playgroud)

步骤3-使用==或elementsEqual比较

let isEqual = lhsArray == rhsArray
Run Code Online (Sandbox Code Playgroud)

要么

let isEqual = lhsArray.elementsEqual(rhsArray, by: { $0 == $1} )
Run Code Online (Sandbox Code Playgroud)

方法2(没有平等协议)

步骤1-按方法1,步骤2中所述对数组进行排序

第2步-使用elementsEqual

lhsArray.elementsEqual(rhsArray, by: { $0.identifier == $1.identifier })
Run Code Online (Sandbox Code Playgroud)

在此处阅读有关数组比较的更多信息


小智 5

如果您有一些参数需要比较,可以使用此方法:

let difference = currentObjects
    .filter({ currentObject in
        !(newObjects
            .contains(where: { $0.identifier == currentObject.identifier }))
    })

Run Code Online (Sandbox Code Playgroud)