Kotlin中如何生成字符串字符出现次数Map(不使用传统for循环)
在Kotlin中无传统for循环实现字符计数Map
嘿,这事儿在Kotlin里真的很简单,标准库给我们准备了现成的函数式工具,完全不用写那种老式的for循环!针对你给的"Hello World"字符串,我给你两种常用的实现方式:
方法一:用groupingBy + eachCount(最简洁)
这是最推荐的写法,一行代码就能搞定,而且可读性拉满:
val inputStr = "Hello World" // 如果需要保留空格,直接用下面这行 val charCountMap = inputStr.groupingBy { it }.eachCount() // 如果要去掉空格(和你给出的目标结果一致),先过滤空格再统计 val charCountMapWithoutSpace = inputStr.filter { it != ' ' }.groupingBy { it }.eachCount() println(charCountMapWithoutSpace) // 输出 {H=1, e=1, l=3, o=2, r=1, d=1}
原理说明
groupingBy { it }:把字符串里的每个字符作为分组的键,也就是按字符本身分组eachCount():自动统计每个分组里元素的数量,直接返回Map<Char, Int>类型的结果,完美符合你的需求
方法二:用fold函数(更灵活)
如果你想自定义初始化逻辑或者做更多中间处理,fold函数是个不错的选择,同样不需要写传统for循环:
val inputStr = "Hello World" val charCountMap = inputStr.filter { it != ' ' }.fold(mutableMapOf<Char, Int>()) { accMap, currentChar -> // 用getOrDefault处理字符第一次出现的情况,默认计数为0 accMap[currentChar] = accMap.getOrDefault(currentChar, 0) + 1 accMap } println(charCountMap) // 同样得到目标结果
原理说明
fold接收两个参数:初始值(这里是一个空的MutableMap)和一个累加器函数- 累加器函数会遍历每个字符,更新Map里的计数:如果字符已经存在,计数加1;如果不存在,就设为1
- 最后返回更新后的Map,完成统计
这两种方法都完全避开了传统的for循环写法,而且都是Kotlin函数式编程的典型用法,推荐第一种,因为最简洁高效!
内容的提问来源于stack exchange,提问作者pbount
相关产品推荐
相关产品推荐

