我有array
array
个int
,let 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中肯定有一种更简单的方法,对吗?
由于
答案 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]]