swift:计算字典中的重复值

时间:2017-06-27 15:39:25

标签: ios swift count nsdictionary

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

5 个答案:

答案 0 :(得分:3)

使用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

答案 1 :(得分:3)

最直接的方法是使用为此目的设计的构造:计数集。没有原生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))")

答案 2 :(得分:0)

您可以使用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)

答案 3 :(得分:0)

示例设置:

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仅允许两个不同值的事实,允许简单计算例如false计数,假设您计算了true计数(反之亦然)。

答案 4 :(得分:0)

示例:

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