找到了一种计算字符串中字符出现次数的可爱方法:
let inputString = "test this string"
var frequencies : [Character: Int] = [:]
let baseCounts = zip(
inputString, repeatElement(1,count: Int.max))
frequencies = Dictionary(baseCounts, uniquingKeysWith: +)
结果
[“ i”:2,“ r”:1,“ n”:1,“ e”:1,“ s”:3,“”:2,“ g”:1,“ t “:4,” h“:1]
但是我试图对元素使用范围
let secondBaseCounts = zip(inputString, 0...)
frequencies = Dictionary(secondBaseCounts, uniquingKeysWith: +)
但得到不正确的结果:
[“ i”:20,“ r”:12,“ n”:14,“ e”:1,“ s”:20,“”:13,“ g”:15,“ t “:19,” h“:6]
为什么?
答案 0 :(得分:2)
您的第二次尝试没有实现您要实现的目标。 zip(inputString, 0...)
只是将每个字符的Int
索引映射到字符本身。
因此secondBaseCounts
的值为
[“ t”,0),(“ e”,1),(“ s”,2),(“ t”,3),(“”,4),(“ t”,5), (“ h”,6),(“ i”,7),(“ s”,8),(“”,9),(“ s”,10),(“ t”,11),(“ r “,12),(” i“,13),(” n“,14),(” g“,15)]
调用Dictionary(secondBaseCounts, uniquingKeysWith: +)
会对与重复键相关联的每个值求和,这意味着最终frequencies
词典中的值将是inputString
中出现某个字符的所有索引的总和,而不是该字符的出现次数。
答案 1 :(得分:0)
我在没有使用任何内置方法的情况下回答这个问题。最有可能在面试中被问到。
var inputString = "test this string"
extension String {
func countCharacterOccurances() -> Dictionary<String, Any> {
var occuranceDict : [String : Int] = [:]
for i in self {
var count = 1
if occuranceDict[String(i)] == nil {
occuranceDict[String(i)] = count
}
else {
count = occuranceDict[String(i)] ?? 0
count += 1
occuranceDict[String(i)] = count
}
}
return occuranceDict as Dictionary<String, Any>
}
}
var characterOccuranceDict = inputString.countCharacterOccurances()
<块引用>
输出:["h": 1, "t": 4, "i": 2, "g": 1, "s": 3, "r": 1, " ": 2, "n" : 1, "e": 1]
如果你想要一个按键字母顺序排序的字典,下面的代码很有用。否则,您可以打印 characterOccuranceDict。
<块引用>问题陈述:-“编写一个程序来计算字符串中的连续字符并按给定顺序将它们组合成一个字符串”
let sortedDictionary = characterOccuranceDict.sorted { $0.key < $1.key }
sortedDictionary.forEach { (item) in
finalStr = finalStr + item.key + String(describing: item.value)
}
print(finalStr)
inputString = "AAABBCCCCD"
输出:A3B2C4D1