【问题标题】:compare multiple arrays for same elements in swift快速比较相同元素的多个数组
【发布时间】:2021-01-09 18:43:39
【问题描述】:

我是 swift 和一般编程的新手。我在数据库中有多个名称数组,我需要检查这些数组中的相同名称。 我找到了一些解决方案来比较两个数组,但不是多个,所以我写了一些额外的代码。 但就性能而言,这不是我认为的最佳实践。而且也不是首先添加所有名称然后删除重复项的最佳方法..

有人对我的问题有更好的想法/解决方案吗?

代码:

import UIKit

let array1 = ["Max", "Peter","Kathrin", "Sara", "Kirsten", "Mike", "Elon"]      // Peter, Kathrin, Mike, Sara
let array2 = ["Pamela", "Chris", "James", "Sebastian", "Mike"]                  // Mike, Chris
let array3 = ["John", "Daniel", "Susan", "Mathias", "Mike", "Donald"]           // Mike
let array4 = ["Tim", "Kathrin", "Alan", "Chris", "Amy", "Sara"]                 // Kathrin, Chris
let array5 = ["Cara", "Charly", "Emily", "Maja", "Peter", "Sara"]               // Peter, Sara
// Output should be: Peter, Kathrin, Mike, Sara, Chris

var array = [Array<String>]()
array.append(array1)
array.append(array2)
array.append(array3)
array.append(array4)
array.append(array5)

var names = [String]()

for i in 0...array.count - 2 {
    for z in 1...array.count - 1 {
        if z + i < array.count {
            let commonElements = Array(Set(array[i]).intersection(Set(array[z+i])))
            names.append(contentsOf: commonElements)
        }
    }
}

print(names.removeDuplicates())

扩展名:

extension Array where Element: Hashable {
    func removeDuplicates() -> [Element] {
        var result = [Element]()

        for value in self {
            if result.contains(value) == false {
                result.append(value)
            }
        }
        return result
    }
}

【问题讨论】:

  • 关于删除重复项的扩展stackoverflow.com/a/34712330/2303865
  • 正如您所说的数据库,最好的方法是插入新对象之前检查重复的权限。
  • @vadian 他们在数据库中多次出现是完全正确的,这是因为他们注册了一些东西,在这些情况下注册了很多东西,我只想让那些签名的人多方面的事情

标签: arrays swift


【解决方案1】:

如果您的意图只是检查一个名称是否出现在多个集合中,我认为解决此问题的最佳方法是创建一个包含所有名称的集合并过滤重复项,如 post 所示

let array1 = ["Max", "Peter","Kathrin", "Sara", "Kirsten", "Mike", "Elon"]
let array2 = ["Pamela", "Chris", "James", "Sebastian", "Mike"]
let array3 = ["John", "Daniel", "Susan", "Mathias", "Mike", "Donald"]
let array4 = ["Tim", "Kathrin", "Alan", "Chris", "Amy", "Sara"]
let array5 = ["Cara", "Charly", "Emily", "Maja", "Peter", "Sara"]

var names: [String] = []
names.append(contentsOf: array1)
names.append(contentsOf: array2)
names.append(contentsOf: array3)
names.append(contentsOf: array4)
names.append(contentsOf: array5)

extension RangeReplaceableCollection where Element: Hashable {
    var duplicates: Self {
        var set: Set<Element> = []
        var filtered: Set<Element> = []
        return filter { !set.insert($0).inserted && filtered.insert($0).inserted }
    }
}

// Output should be: Peter, Kathrin, Mike, Sara, Chris
print(names.duplicates)  // ["Mike", "Kathrin", "Chris", "Sara", "Peter"]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    相关资源
    最近更新 更多