如何比较结构数组以查看哪些元素不同?

时间:2015-05-21 11:17:18

标签: swift ios8

我有两个结构数组,其中包含一些我要比较的双打。

我想将旧数组的每个空间与较新的数组进行比较,并查看哪些索引包含两个双精度匹配的结构,并从两个数组中较新的数组中删除它们。我希望最终结果是一个只包含第一个数组中未包含的双精度数组的数组。换句话说,两个阵列都有不同的集合。

我最初尝试一次遍历每个索引,但删除索引会扰乱循环。所以我尝试创建第三个数组来添加不相同的数组,但是我很难弄清楚如何有效地找出哪些是不同的。

有没有人知道的快速Swift解决方案可以有效地帮助解决这个问题?

这是我到目前为止的代码,但我有点卡在这里,因为结果将无处接近我正在寻找的......

if userPosts.count == 0 {
        userPosts = newArrayOfUserPosts
    }
    if newArrayOfUserPosts.count > 0 {
        for currentCount in 0...userPosts.count - 1 {

            for eachElement in 0...newArrayOfUserPosts.count - 1 {

                if newArrayOfUserPosts[eachElement].postLatitude != userPosts[currentCount].postLatitude && newArrayOfUserPosts[eachElement].postLongitude != userPosts[currentCount].postLongitude {

                }
            }
        }
    }

3 个答案:

答案 0 :(得分:3)

如果我正确理解了您的问题,您可以使用Setsubtract方法来获取数组中的差异。以下是使用Set<Int>的示例:

let oldArray = [0, 2, 7, 5, 10]
let newArray = [0, 2, 7, 5, 10, 11, 8, 20]

let oldSet = Set(oldArray)
let newSet = Set(newArray)

Array(newSet.subtract(oldSet)) // [20, 11, 8]

或者如果您想要它在一行:

Array(Set(newArray).subtract(Set(oldArray))) // [20, 11, 8]

为此,您需要使结构符合Hashable

有关Set的更多信息,请查看 The Swift Programming Guide: Collection Types

答案 1 :(得分:0)

let firstArray = [1, 2, 3, 4, 5, 6]

let secondArray = [3, 4, 5, 6, 7, 8]

secondArray.filter{!contains(firstArray, $0)} //[7, 8]

这将获取第二个数组,并删除第一个数组中的所有内容。但这只适用于Equatable的东西。要使你的结构在其中的某个变量上相等,你必须实现==,基于你认为使两个结构相同的结果。这是一个例子:

struct Person : Equatable {
  let name: String
  let age: Int
}

func == (leftHandSide: Person, rightHandSide: Person) -> Bool {
  return leftHandSide.name == rightHandSide.name
}

有一个结构,人。在其中,您可以拥有一个人的姓名和年龄。我们可以决定根据他们的名字来识别人,这就是我们的==函数在.name。

上工作的原因

以下是过滤的工作原理:

let youngBarry = Person(name: "Barry", age: 25)
let joanna = Person(name: "Joanna", age: 32)
let oldBarry = Person(name: "Barry", age: 44)

let firstArray = [youngBarry]

let secondArray = [oldBarry, joanna]

let filteredSecondArray = secondArray.filter{!contains(firstArray, $0)} //Joanna

当我们想从第一个数组中的第二个数组中删除东西时,我们的==函数会查看oldBarry和youngBarry,并确定它们是相同的,所以在第二个数组中不包括oldBarry。 / p>

现在,如果您想要删除更复杂或可变的行为,您仍然可以,因为“contains”可以关闭。这是与上面相同的代码,但没有==实现:

let filteredSecondArray = secondArray.filter{
  secondArrayElement in

  !contains(firstArray) {

    firstArrayElement in

    return secondArrayElement.name == firstArrayElement.name

  }

}

但是,您的用例看起来更适合实现Equatable。这是你如何做到的。:

extension YourStruct : Equatable {}

func == (lhs: YourStruct, rhs: YourStruct) -> Bool {
  return lhs.postLatitude == rhs.postLatitude && lhs.postLongitude == rhs.postLongitude
}

然后只是:

let filteredNewArrayOfUserPosts = newArrayOfUserPosts.filter{!contains(userPosts, $0)}

答案 2 :(得分:0)

将Equatable添加到您的结构中。

struct Refinement: Equatable {
    let key: String
    var value: String
}

如果要添加自己的条件,请添加

func == (leftHandSide: Refinement, rightHandSide: Refinement) -> Bool {
    return (leftHandSide.key == rightHandSide.key) && (leftHandSide.value == rightHandSide.value)
}

否则,它将默认检查struct中的所有值。

然后按常规 ==

检查数组
if expectedFacetRefinements == facetRefinements {
    print("true")
} else {
    print("false")
}