朱涛 · Kotlin 编程第一课
朱涛
Google 认证的 Kotlin、Android 开发者专家,博客“Kotlin Jetpack 实战”作者
6717 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
朱涛 · Kotlin 编程第一课
15
15
1.0x
00:00/00:00
登录|注册

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
立即购买
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • colin
    String.clean() 使用顶层扩展好像不太合适,顶层扩展只适用于通用的逻辑,否则不清楚的人看着 idea 提示的扩展函数也一脸懵逼。

    作者回复: 赞~很有道理。

    2022-01-13
    15
  • A Lonely Cat
    fun 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-12
    7
  • 奥特之光
    fun foo(block: () -> Unit) { block() } 从开始讲函数到这节课看完,我还没有发现有讲过->是什么意思,这里() -> Unit这让人很懵,然后下面这个block()和参数的block又是啥关系?

    作者回复: “->”其实就是:参数类型、返回值类型,它们两者之间的分界线。

    2022-05-03
    5
    1
  • _
    没用过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-25
    2
  • ElleSky
    如果方法变得足够大,过度使用 inline 可能会妨碍或停止 Hotspot 优化(例如方法内联)。默认情况下, Hotspot 不会内联大于35个字节的方法。内联高阶函数也得根据实际情况吧?
    2023-02-22归属地:山东
    1
  • ElleSky
    hi,你好呀,请问你这gif图是用的什么软件生成的呢?
    2023-02-08归属地:山东
  • 晓春
    Kotlin 最新 sortedByDescending 返回的是 List, sortByDescending 返回的是 Unit
    2023-01-12归属地:上海
  • 熊妈饭团
    为什么 inline mapToList 是private的method,当被拷贝到public area 执行时却不会报错呢?
    2022-11-01归属地:美国
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部