去年的今天,金庸与世长辞,当时Jerry在成都地铁一号线下班的路上得知了这个消息,回到家立即写了一篇文章来悼念:金庸的武侠世界和SAP的江湖。

一年的时间转瞬即逝,大家都忙碌于各自的生活,很多人对金老的离世已经淡忘了,不过Jerry这种金庸的死忠粉,对于这个一周年忌日还是记得很清楚的。

因为Jerry手上事情很多,没时间在这个特殊的日子写文章纪念了,就发一小段代码吧。

需求:列出金庸任意一本小说里出现的所有成语。

实现:Jerry部署在Github上的一个web应用,链接如下:

http://jerrywang-sap.cn/FioriODataTestTool2014/WebContent/050_Keyword.html

首先点击超链接“成语全集”:

点击之后,存储于该web应用本地存储的一个文本文件里的全部19830个成语,以树的形式加载到内存中,并显示在网页上:

然后复制一本金庸小说的内容,粘贴到网页的“内容”区域,点击按钮“测试”:

可以看到仅仅用了246毫秒,就将这部一百多万字的《倚天屠龙记》里出现的所有成语,以红色高亮的方式高亮出来。

这个功能咋实现的?Chrome打开Jerry的网页,F12开启开发者工具,就能看到JavaScript源代码,当然也可以从我的Github上获得.

Jerry简单讲下实现原理。Web应用里有一个文本文件,里面维护了汉语里全部的成语,通过分号分隔。

运行时,这些内容会被加载到内存中,构建成一棵树,如下图所示:

其中叶节点以属性end为true区分。

成语检索的核心逻辑位于search函数里,让我们用《笑傲江湖》里一句响亮的口号“日月神教千秋万载,一统江湖”来单步调试,了解其实现逻辑。

进入165行的外层while循环,再进入173行的内层for循环,检测是否有测试字符串第一个字符“日”开头的成语。因为成语是由4个字符组成,所以需要用内层for循环逐一试探,如果遇到tblCur.end为true的元素,说明在测试字符串中发现了一个成语。

下图是内层for循环第一次执行后的tblCur内容:

内层循环执行第二次,此时tblCur指向一棵由所有“日月”开头的成语组成的树:

执行内层循环的第三次迭代,因为在树“日-月”这个分支下面没有“神”这个节点,所以结束当前的内层循环,通过break返回到外层的while循环,进行输入字符串第二个字符“月”的新一轮试探,以此类推。

最后从“千”这个字符出发,沿着内存中的树经过路径"秋-万",最后来到end属性为true的叶节点“载”,记下“千”在输入字符串中的偏移量,存到一个数组arrMatch中去。

待输入字符串全部试探完毕后,根据arrMatch中存放的偏移量,高亮显示对应的字符串,完成检索。

树这个数据结构在这个需求的实现里有着完美的表现。

金庸虽然离开了我们,但他笔下那些人物和发生的故事,将永远流传于这个世上。

更多阅读

  • 金庸的武侠世界和SAP的江湖
  • 金庸和古龙,Netweaver和微服务,以及SAP Hybris Revenue Cloud
  • 作为一名SAP从业人员,需要专门学习数学么

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

使用代码列出金庸小说中使用过的所有成语相关推荐

  1. 金庸小说中的农业漏洞[ZT]

    历史悖谬问题在小说中是极常见的,<金瓶梅>和<堂吉诃德>等都有很多疏漏,其中有些是有违历史常识的.某网站上有一个小专栏名为"骨头大家挑",专找金庸小说中的漏 ...

  2. 我们分析了金庸小说中出现的1367个人物名字,发现了一些相当惊人的事情

    如果你也想赚钱,实现财务自由,但接触不到优质的人脉和资源,可以到公June浩:成长home,发"资源" ,就会看到我吐血整理的168条保姆级零基础吸金秘籍,跟着我一起亲历毕业5年. ...

  3. 金庸小说中的美女与佳人

    金庸小说中的美女? 这可能是一个比较老的话题了.如果"到Google上百度一下",能找到不下百万条的记录结果.之所以会有这么多结果,可能和每个读者心目中的理想美女标准不一吧. 尽管 ...

  4. 金庸小说中的扫地僧来源

    <天龙八部>人物关于年龄 扫地僧扫地僧出场时,"一个身穿青袍的枯瘦僧人拿着一把扫帚,正在弓身扫地.这僧人年纪不少,稀稀疏疏的几根长须已然全白",又说他来了"不 ...

  5. 奇文:金庸小说中的第一高手是谁?

    http://kuangfei.blogbus.com/logs/34404373.html 这个作者太有才了:)

  6. 把金庸小说数据化——关于语言的思一点考

    先看几道有关金庸小说的问题: 第一题: 1.一男性角色叫她姑姑,但二者没有血缘关系: 2.她的师父是女性,师父的师父也是女性: 3.她于人情世故所知甚少,更习惯生活在原来的的环境中. 4.曾经有一位武 ...

  7. 【转载】浅析金庸武侠小说中的哲理意蕴

    作者:刘幸 青年文学家2016年30期 武侠小说在中国文学中一直占据着一个非常重要的位置.无论是梁羽生,还是金庸,都是当代武侠小说创作的大师.他们的武侠小说,以现代小说的写作技巧为纲,在传统的写作手法 ...

  8. 从金庸小说看古代武侠世界计划生育

    当我们还在狠批马寅初的人口论,号召群众大生特生的时代,金庸已经在自己的小说中实行了严格的计划生育政策.鉴于金庸小说在宣传计划生育方面的突出贡献,有必要授予金庸计划生育先进工作者称号. 金庸小说的主要人 ...

  9. 孔庆东看金庸小说的奇情怪恋

    孔庆东看金庸小说的奇情怪恋 主讲人简介: 孔庆东,北京大学中文系副教授.祖籍山东,系孔子第73代直系传人.1983年自哈尔滨考入北京大学中文系,钱理群先生的开山硕士.严家炎先生的博士, 主攻现代小说与 ...

最新文章

  1. mysql 函数rep_Mysql之各种各样的函数啦
  2. 使用python完成的一个烟花小程序-人人都可以写的可视化Python小程序第二篇:旋转的烟花...
  3. Mathematica该注意的两种特殊的输入方式(blanksequence and ruledelayed)
  4. js变量后面加问号是什么_js没那么简单(1)-- 执行上下文
  5. Java多线程之间访问实例变量
  6. C/C++ linux 分享库源码网站收藏
  7. maven的离线模式
  8. 逻辑人渴望控制那些让他们感兴趣的东西
  9. sql2005-数据库备份方案
  10. 搜狗浏览器收藏夹在哪_安卓Edge浏览器最新版42.0.2轻体验,整体优良但无特别惊喜...
  11. STM32-通用定时器-PWM输出
  12. 因担心5G电磁辐射 这个地方的居民试图阻止5G基站扩张
  13. 毕设日志——Fast RCNN
  14. 【经验心得】固定布局做到各手机屏幕适配简单粗暴的方法
  15. Flutter代码锦囊---魔改进度条
  16. 小猿圈python之python期末考试测试题(二)_小猿圈python之练习题
  17. python中把输出结果写到一个文件中_python 文件中字符串过滤,并将结果输出到另一个文件中(源码)...
  18. 【重磅】这家技术贼牛的开源公司开始狂招人啦!
  19. 【沐风老师】3DMAX随机挤出插件2DExtruder使用教程
  20. 晶振原理详解及测试方法

热门文章

  1. find、文件后缀及linux与Windows互传
  2. .Net 常用的ORM框架
  3. onsubmit表单提交简单使用
  4. Springboot错误页面和错误信息定制
  5. docker-compose 搭建 Rap2 接口管理平台
  6. Linux驱动学习--wifi驱动(rtl88xx系列网卡芯片)源码分析
  7. 2017年总结(补全)
  8. 类 SimpleDateFormat
  9. 阿里云的云服务器ECS和云虚拟主机有何区别?
  10. 关于Android针孔摄像头检测方法