2017-06-27 27 views
-1

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

+0

字典不能有多个相同的密钥,所以你给的例子在Swift中是不可能的。 – deadbeef

+0

我假设'uid是很多不同的唯一ID的占位符? – deanWombourne

+0

@deanWombourne是的,'uid'值是一个占位符。这将是实际的:65vsFeX5y9R69YuvltgS1dL6pFN2 – Hunter

回答

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))") 
+0

这对我所需要处理的数据最有效。感谢您的时间和答案。 – Hunter

0

使用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 
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) 
+0

在什么情况下一通? 'dict.reduce((trues:0,falses:0)){ return(true:$ 0.trues +($ 1.value?1:0), false:$ 0.falses +($ 1.value?0:1 )) }' – deanWombourne

+0

@deanWombourne是的,绝对适用于一个班轮。 –

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