Swift 3提取类似的对象

时间:2017-09-06 12:25:22

标签: arrays swift3

我有array arrayintlet pairs:[[Int]]

我正在寻找一种提取类似元素的优雅方式。

例如,我的对变量可能包含:[ [1,2], [4,6], [1,2] ]

我想提取多次出现的数组[1,2]。 在示例[ [1,2], [4,6], [1,2], [3,7], [4,6] ]中,我想提取[1,2][4,6]

起初这看起来微不足道,但是我对它的每一次操作变得非常麻烦,很多"辅助阵列"和嵌套" for循环"。在Swift中肯定有一种更简单的方法,对吗?

由于

2 个答案:

答案 0 :(得分:0)

这里使用一个辅助字典和一个循环的方式:

let pairs = [[1,2], [4,6], [1,2]] // The original array
var pairCount = [NSArray : Int]() // This is helper dictionary. The key is the array, the value is - how much time it appears in the source array. I use NSArray because swift array does not conform to Hashable protocol.
var newPairs = [[Int]]()

for pair in pairs { // Iterate over our pairs
    var count: Int = pairCount[pair as NSArray] ?? 0 // If we already have a pair in our dictionary get count of it in array otherwise het 0

    count += 1 // increase counter

    pairCount[pair as NSArray] = count // save in dictionary
}

let pairsWithCountMoreThanOne = pairCount.flatMap({$1 > 1 ? $0 : nil}) // here we get the result

for pair in pairsWithCountMoreThanOne { // Just print it
    print("\(pair)")
}

对于大型数组或大型对象,此代码可能不具有内存效率,但它实际上是微不足道的。

答案 1 :(得分:0)

请检查以下内容:

let pairs = [ [1,2], [4,6], [1,2], [3,7], [4,6], [3,5], [4,6] ]
var repeats = [[Int]]()

pairs.forEach { (i) in
    let count = (pairs.filter{ return $0 == i }).count
    if count > 1 {
        if !repeats.contains(where: { (pair) -> Bool in
            return pair == i
        }) {
            repeats.append(i)
        }
    }
}
print(repeats) // Output is : [[1, 2], [4, 6]]