我有一个排序数组。我想迭代数组并在找到值对时递增计数器。我找不到一个优雅的解决方案。
var pairs = 0
let colors = [10, 20, 20, 10, 10, 30, 50, 10, 20
let sortedColors = colors.sorted{ $0 < $1}
// [10, 10, 10, 10, 20, 20, 20, 30, 50] -> pairs should equal 3
for i in 0..<colors.count - 1 {
if sortedColors[i+1] != colors.count && sortedColors[i] == sortedColors[i+1] {
pairs += 1
}
}
print(pairs)
答案 0 :(得分:3)
您也可以使用新的Dictionary语法,
使用分组语法
let pairs = Dictionary(grouping: colors){ $0 }
.map { $1.count / 2 }
.reduce(0, +)
print(pairs)
使用unquing语法,
let pairs = Dictionary( zip( colors, Array(repeating: 1, count: colors.count)),
uniquingKeysWith: +)
.reduce(0, { $0 + $1.1 / 2})
答案 1 :(得分:2)
我只计算重复次数,然后将重复次数除以2来计算重复次数。例如,如果一个数字出现3次,则有一对:
let colors = [10, 20, 20, 10, 10, 30, 50, 10, 20]
let countedSet = NSCountedSet(array: colors)
let pairs = countedSet.map { countedSet.count(for: $0) / 2 }.reduce(0, +)
print(pairs) // 3
不幸的是,还没有Swift CountedSet
:(
答案 2 :(得分:2)
另一种与@Sulthan's answer类似的方法是使用字典来计算事件而不是NSCountedSet
:
let colors = [10, 20, 20, 10, 10, 30, 50, 10, 20]
let numberOfPairs = colors
.reduce(into: [:]) { counts, num in counts[num, default: 0] += 1 }
.reduce(0) { cumsum, kv in cumsum + kv.value / 2 } // 3
或者,在两个闭包中使用速记参数名称:
let numberOfPairs = colors
.reduce(into: [:]) { $0[$1, default: 0] += 1 }
.reduce(0) { $0 + $1.value / 2 }
在上述情况下,对于数字出现次数,我们在Q&amp; A中使用了@vacawama's answer,我最初用作此Q&amp; A的标记的目标。