2017-06-27 54 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