遍历数组以查找值对

时间:2018-03-13 16:42:53

标签: swift

我有一个排序数组。我想迭代数组并在找到值对时递增计数器。我找不到一个优雅的解决方案。

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)

3 个答案:

答案 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的标记的目标。