利用kotlin实现统计文件字符个数的方法示例

4
回复
577
查看
[复制链接]

359

主题

359

帖子

828

安币

手工艺人

发表于 2018-3-13 11:50:50 | 显示全部楼层 |阅读模式

            

        前言

        对于开发的大家来说,统计文件字符个数是个常见的程序。今天利用刚学习的kotlin来实现一下。下面话不多说了,来一起看看详细的介绍吧。

        方法如下:

        首先找到一个要统计的文件。

[Java] 查看源文件 复制代码
val file = "f:\\mybook\\读书备忘录.txt"

        然后建立一个hashmap,用来存储统计的结果。

[Java] 查看源文件 复制代码
val map = hashmap<char, int>()

        读取文件内容,转换成char进行遍历统计

[Java] 查看源文件 复制代码
file(file).readtext().tochararray().filternot(char::iswhitespace).foreach {
  val count = map[it]
  if (count == null){
   map[it] = 1
  }else{
   map[it] = count +1
  }  
 }

        readtext()就是读取文件内容了

        tochararray()转成char数组

        filternot(char::iswhitespace)忽略空格

        遍历的时候,把当前遍历到的map[it]赋给 count ,如果在 map 中没找到这个字符,即 count == null,则为初次记录,map[it] 为1,否则 map[it] 已经记录过了,在原有计数基础上加1。

        最后输出统计结果

[Java] 查看源文件 复制代码
map.foreach { t, u -> println("字符\"$t\"出现了 $u 次")}

        执行效果如下

[Java] 查看源文件 复制代码
统计文件中每个字符的个数
字符"言"出现了 1 次
字符"需"出现了 1 次
字符"最"出现了 1 次
字符"要"出现了 1 次
字符"节"出现了 1 次
字符"。"出现了 1 次
字符"窄"出现了 1 次
字符"的"出现了 1 次
字符"★"出现了 5 次
字符"("出现了 1 次
字符"按"出现了 1 次
字符")"出现了 1 次
字符"《"出现了 1 次
字符"》"出现了 1 次
字符","出现了 2 次
字符"完"出现了 1 次
字符"复"出现了 1 次
字符"后"出现了 2 次
字符"题"出现了 1 次
字符":"出现了 1 次
字符"圣"出现了 1 次
字符"个"出现了 1 次
字符"本"出现了 1 次
字符"-"出现了 2 次
字符"."出现了 2 次
字符"0"出现了 4 次
字符"新"出现了 1 次
字符"1"出现了 6 次
字符"2"出现了 3 次
字符"3"出现了 2 次
字符"6"出现了 3 次
字符"边"出现了 1 次
字符"雅"出现了 1 次
字符"g"出现了 1 次
字符"版"出现了 1 次
字符"重"出现了 1 次
字符"经"出现了 1 次
字符"黑"出现了 1 次
字符"体"出现了 1 次
字符"字"出现了 1 次
字符"这"出现了 1 次
字符"距"出现了 1 次
字符"章"出现了 1 次
字符"习"出现了 2 次
字符"d"出现了 1 次
字符"f"出现了 1 次
字符"学"出现了 1 次
字符"书"出现了 1 次
字符"照"出现了 1 次
字符"全"出现了 1 次
字符"语"出现了 1 次
字符"o"出现了 1 次
字符"p"出现了 1 次
字符"数"出现了 1 次
字符"读"出现了 1 次

        上面的读取还不够简练,我们可以再简化一点,完全不必声明 hashmap。

[Java] 查看源文件 复制代码
val file = "f:\\mybook\\读书备忘录.txt"
file(file).readtext().tochararray().filternot(char::iswhitespace).groupby{it}.map {
  it.key to it.value.size
 }.foreach{
  println("字符\"${it.first}\"出现了 ${it.second} 次")
 }

        一样可以达到效果。这才是函数式编程。

        附上:hashmap结构图

        

2017123101725309.jpg

        总结



        

0

主题

9262

帖子

2054

安币

Android大神

Rank: 6Rank: 6

发表于 2018-3-14 05:16:02 | 显示全部楼层
感觉楼主很用心,辛苦啦~

449

主题

1210

帖子

1949

安币

手工艺人

发表于 2018-3-15 05:06:59 | 显示全部楼层
支持,感谢,祝巴士越来越好~

6

主题

9577

帖子

2865

安币

Android大神

Rank: 6Rank: 6

发表于 2018-3-16 10:54:32 | 显示全部楼层
每次我都积极回帖的,想要安币~

14

主题

1万

帖子

3890

安币

码皇(巴士元老)

Rank: 8Rank: 8

发表于 2018-3-17 15:50:30 | 显示全部楼层
支持,感谢,祝巴士越来越好~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )