使用程式碼列出金庸小說中使用過的所有成語
去年的今天,金庸與世長辭,當時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中存放的偏移量,高亮顯示對應的字串,完成檢索。
樹這個資料結構在這個需求的實現裡有著完美的表現。
金庸雖然離開了我們,但他筆下那些人物和發生的故事,將永遠流傳於這個世上。
更多閱讀
要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2662127/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 金庸武俠小說經典語錄大全 金庸小說裡的名言精選
- 1、說說你瞭解過、使用過什麼程式語言?比較小他們的優點 2、說說你瞭解過、使用過什麼程式設計工具?程式設計
- 如何使用簡單程式碼列出Spring Boot暴露的所有端點? - ZaniniSpring Boot
- 瞭解過、使用過的程式語言及其優勢,瞭解過、使用過的程式設計工具程式設計
- 使用lsblk命令列出系統中的塊裝置命令列
- markdown使用小說明
- 幽默:過度使用Lambda的Java程式碼Java
- 小程式模板的使用
- 程式人生—成為一個有成績可說的職場人
- ASP程式中常使用的幾種指令碼語言指令碼
- JavaScript 獲取瀏覽器的所使用語言JavaScript瀏覽器
- 清華社互動英語視聽說答題指令碼的使用說明指令碼
- mysql語法使用詳細程式碼版MySql
- Vue使用中遇到的程式碼問題Vue
- 谷歌、阿里都在使用的dart程式語言,你學過沒?谷歌阿里Dart
- 小程式中神祕的使用者資料
- 如何使用air自動過載程式碼AI
- DataLakeAnalytics中OSSLOCATION的使用說明
- CentOS7中使用systemctl列出啟動失敗的服務CentOS
- 金庸逝世兩週年:一個失意程式設計師的囈語程式設計師
- Vue 使用中的小技巧Vue
- 你有使用過JWT嗎?說說你對它的理解JWT
- 使用sqlmap中tamper指令碼繞過wafSQL指令碼
- 簡單演示Excel中VBA程式碼的使用Excel
- 使用chatgt(GPT-4)將過程式(的java程式碼)改成函式式(的elixir程式碼)GPTJava函式
- 小程式使用Picker遇到的坑
- 小程式自定義元件的使用元件
- 微信小程式的底部使用微信小程式
- 小程式之藍芽的使用藍芽
- 小程式mpvue-echarts的使用VueEcharts
- 使用 ESLint + Prettier 簡化程式碼 Review 過程EsLintView
- 你真的使用過低程式碼產品嗎?
- 微信小程式 使用filter過濾器幾種方式微信小程式Filter過濾器
- 小程式使用 async awaitAI
- 小程式如何使用WXS
- php中return語句的使用PHP
- MySQL中explain語句的使用MySqlAI
- 微信小程式video在元件中的使用---暫停影片微信小程式IDE元件