08 | 实战:用Kotlin写一个英语词频统计程序
朱涛
你好,我是朱涛。
前面几节课,我们学了一些 Kotlin 独有的特性,包括扩展、高阶函数等等。虽然我在前面的几节课当中都分别介绍了这些特性的实际应用场景,但那终归不够过瘾。因此,这节课我们来尝试将这些知识点串联起来,一起来写一个“单词词频统计程序”。
英语单词的频率统计,有很多实际应用场景,比如高考、研究生考试、雅思考试,都有对应的“高频词清单”,考生优先突破这些高频词,可以大大提升备考效率。那么这个高频词是如何统计出来的呢?当然是通过计算机统计出来的。只是,我们的操作系统并没有提供这样的程序,想要用这样的功能,我们必须自己动手写。
而这节课,我将带你用 Kotlin 写一个单词频率统计程序。为了让你更容易理解,我们的程序同样会分为三个版本。
1.0 版本:实现频率统计基本功能,使用“命令式风格”的代码。
2.0 版本:利用扩展函数、高阶函数来优化代码,实现“函数式风格”的代码。
3.0 版本:使用 inline 进一步提升软件的性能,并分析高阶函数的实现原理,以及 inline 到底能带来多大的性能提升。
在正式开始学习之前,我也建议你去 clone 我 GitHub 上面的 TextProcessor 工程:https://github.com/chaxiu/TextProcessor.git,然后用 IntelliJ 打开,并切换到 start 分支跟着课程一步步敲代码。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了使用Kotlin编写英语词频统计程序的实战过程。作者分别介绍了程序的三个版本,从基本功能的实现到使用扩展函数、高阶函数实现函数式风格的代码,再到使用inline进一步提升软件性能。文章详细介绍了文本清洗、文本分割、词频统计和词频排序等步骤,并提供了相应的代码示例。重点介绍了文本清洗和词频统计两个方法的实现过程,以及使用Map数据结构进行词频统计的细节。通过本文,读者可以了解如何利用Kotlin语言特性来实现一个实用的文本处理程序,同时也能学习到一些实际的编程技巧和最佳实践。此外,文章还深入探讨了inline关键字的实现原理和性能提升效果,以及其在高阶函数中的应用。同时,也提到了inline的局限性,警示读者在使用时需要注意其实现机制,以避免引发问题。整体而言,本文内容丰富,深入浅出,适合对Kotlin编程感兴趣的读者阅读学习。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《朱涛 · Kotlin 编程第一课》,新⼈⾸单¥59
《朱涛 · Kotlin 编程第一课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(10)
- 最新
- 精选
- colinString.clean() 使用顶层扩展好像不太合适,顶层扩展只适用于通用的逻辑,否则不清楚的人看着 idea 提示的扩展函数也一脸懵逼。
作者回复: 赞~很有道理。
2022-01-1315 - A Lonely Catfun main() { val word = "Kotlin is my favorite language. I love Kotlin!" val wordFrequencyList = word.clean() .participle() .countWordFrequency() .toList() .sortedByDescending { it.second } wordFrequencyList.forEach { println("word is ${it.first}, frequency is ${it.second}") } } /** * 文本清洗 */ private fun String.clean() = replace("[^A-Za-z]".toRegex(), " ") .trim() /** * 分词 */ private fun String.participle() = split(" ").toList() /** * 计算词频 */ private fun List<String>.countWordFrequency(): Map<String, Int> { val map = mutableMapOf<String, Int>() forEach { if (it.isNotBlank()) { val count = map.getOrDefault(it, 0) map[it] = count.plus(1) } } return map.toMap() }
作者回复: 赞,可读性更好了。
2022-01-127 - 奥特之光fun foo(block: () -> Unit) { block() } 从开始讲函数到这节课看完,我还没有发现有讲过->是什么意思,这里() -> Unit这让人很懵,然后下面这个block()和参数的block又是啥关系?
作者回复: “->”其实就是:参数类型、返回值类型,它们两者之间的分界线。
2022-05-0351 - _没用过JMH,查了一下Score的含义,默认情况下是Throughput模式,Score代表单位时间内执行的操作次数,所以testInlined要比testNoninlined快10倍。 https://stackoverflow.com/questions/24928922/jmh-what-does-the-score-value-mean
作者回复: 是的
2022-04-24 - 阿康在正式开始学习之前,我也建议你去 clone 我 GitHub 上面的 TextProcessor 工程:https://github.com/chaxiu/Calculator.git,然后用 IntelliJ 打开,并切换到 start 分支跟着课程一步步敲代码。 源码连接错了
作者回复: 被你发现了,马上改过来。感谢感谢。
2022-01-12 - 郑峰One liner fun processText(text: String) = text.replace("[^A-Za-z]".toRegex(), " ").trim() .split(" ").filter(String::isNotBlank) .groupingBy { it }.eachCount() .map { WordFreq(it.key, it.value) } .sortedByDescending { it.freq }2022-07-252
- ElleSky如果方法变得足够大,过度使用 inline 可能会妨碍或停止 Hotspot 优化(例如方法内联)。默认情况下, Hotspot 不会内联大于35个字节的方法。内联高阶函数也得根据实际情况吧?2023-02-22归属地:山东1
- ElleSkyhi,你好呀,请问你这gif图是用的什么软件生成的呢?2023-02-08归属地:山东
- 晓春Kotlin 最新 sortedByDescending 返回的是 List, sortByDescending 返回的是 Unit2023-01-12归属地:上海
- 熊妈饭团为什么 inline mapToList 是private的method,当被拷贝到public area 执行时却不会报错呢?2022-11-01归属地:美国
收起评论