Swift 按值排序[Character:Int]字典时出现返回类型不匹配报错
报错核心原因
- Swift 中
[Character: Int]对应的Dictionary类型是无序集合,本身不存储键值对的排序规则。 - 调用字典的
sorted方法时,返回值类型固定为[(key: Character, value: Int)](键值元组组成的数组),和声明的[Character: Int]返回类型不匹配,因此抛出类型转换错误。 - 原代码另外两个逻辑问题:
- 排序闭包写反了顺序:要让重复次数最高的字符排在最前,需要用
$0.value > $1.value做降序排序,原代码的<是升序,会把出现最少的字符放最前。 - 字符计数逻辑效率极低:每次遍历字符时都调用
filter全量扫描字符串,时间复杂度达到O(n²),长字符串下性能很差。
- 排序闭包写反了顺序:要让重复次数最高的字符排在最前,需要用
修正方案
根据是否需要强依赖排序后的顺序,选对应实现即可:
方案1(推荐):调整返回值类型为有序元组数组
有序的键值序列本质就不适合用字典承载,直接把返回值改成排序后的元组数组类型,顺序100%稳定,也是Swift中处理排序后键值对的标准做法:
let str = "the brown fox jumps over the lazy dog" func characterCount(str: String) -> [(key: Character, value: Int)] { var results: [Character : Int] = [:] // 单次遍历完成字符计数,时间复杂度O(n) for char in str { results[char, default: 0] += 1 } // 按出现次数降序排序 let sortedResults = results.sorted { $0.value > $1.value } return sortedResults } print(characterCount(str: str))
方案2:强制返回字典类型(不推荐)
Swift 5+ 中的Dictionary会保留键值对的插入顺序,你可以把排序后的元组按顺序重新写入新字典返回,但要注意:这个顺序不是Dictionary类型的契约保证的,跨Swift版本、跨运行平台时可能出现顺序错乱,不要在强依赖顺序的场景用:
let str = "the brown fox jumps over the lazy dog" func characterCount(str: String) -> [Character : Int] { var results: [Character : Int] = [:] for char in str { results[char, default: 0] += 1 } let sortedTuples = results.sorted { $0.value > $1.value } // 按排序后的顺序重组字典 return sortedTuples.reduce(into: [Character: Int]()) { dict, item in dict[item.key] = item.value } } print(characterCount(str: str))
内容的提问来源于stack exchange,提问作者OxfordSi
相关产品推荐
相关产品推荐

