Swift:计算字典中的重复值



我有一个 [uid: true, uid: false, uid: false, uid: false]的字典。我如何在Swift中计算truefalse值的数量,从而可以看到此词典中有1个true和3 false

最直接的方法是使用为此目的设计的构造:一个计数集。没有本机Swift计数集,但是您可以使用NSCountedSet

计数集的工作原理与集合完全一样,但是它计算了您在其中添加元素的次数。

let dict = [
    "key1": true,
    "key2": true,
    "key3": false
]
let countedSet = NSCountedSet()
for (_, value) in dict {
    countedSet.add(value)
}
print("Count for true: (countedSet.count(for: true))")

使用filter方法删除您不需要的值,然后在结果上调用count

// Get the count of everything which is true
let trueCount = dict.filter { $0.value }.count
// Get the count of everything which is false
let falseCount = dict.filter { !$0.value }.count
// A more efficient way to get the count of everything which is false
let falseCount = dict.count - trueCount

您可以使用reduce

的高阶功能
let trueFalstDict: [String: Bool] = ["id1": false, "id2": true, "id3": false, "id4": false]
var trueFalseCount: (trues: Int, falses: Int)
trueFalseCount.trues = trueFalstDict.reduce(0) { $0 + ($1.value ? 1 : 0) }
trueFalseCount.falses = trueFalstDict.reduce(0) { $0 + ($1.value ? 0 : 1) }
print(trueFalseCount) // (trues: 1, falses: 3)

使用 @deanwombourne的建议:

let trueFalstDict: [String: Bool] = ["id1": false, "id2": true, "id3": false, "id4": false]
var trueFalseCount: (trues: Int, falses: Int)
trueFalseCount = trueFalstDict.reduce((trues: 0, falses: 0)) {
    return (
        true: $0.trues + ($1.value ? 1 : 0),
        false: $0.falses + ($1.value ? 0 : 1)
    )
}
print(trueFalseCount) // (trues: 1, falses: 3)

示例设置:

let dict = [
    1: true,
    2: false,
    3: false,
    4: false
]

使用NSCountedSet

let numTrue = NSCountedSet(dict.values).count(for: true)
let numFalse = dict.count - numTrue

使用reduce

let numTrue = dict.values.reduce(0) { $0 + ($1 ? 1 : 0) }
let numFalse = dict.count - numTrue

两种方法都利用了Bool仅允许两个不同值的事实,可以简单地计算例如鉴于您已经计算了true计数(反之亦然(的false计数。

示例:

var currencyDB:[(name: String, value: Double, isShows: Bool, isMain: Bool)] = 
[("USD",1.1588, true, true), 
("JPY",129.30, true, false), 
("BGN",1.9558, true, false), 
("CZK",25.657, true, false), 
("DKK",7.4526, false, false), 
("GBP",0.8905, false, false)]
print(currencyDB.map{ $0.2 }.filter { $0 }.count))  // print: 4 -> trues
print(currencyDB.map{ $0.2 }.filter { !$0 }.count)) // print: 2 -> falses

最新更新