摘要:問題設定在思維簡圖中,軟件可以將用戶錄入的文本直接轉化為思維導圖。暫時設為一個空數組。孫中山將同盟會的綱領概括為三大主義,即民族主義民權主義民生主義,后被稱為三民主義。
問題設定
在思維簡圖中,軟件可以將用戶錄入的文本直接轉化為思維導圖。其規則是:用戶錄入的文字必須以一個感嘆號作為一個節點的起始標記,一個感嘆號表示后面的文字處于第一級節點,兩個感嘆號表示后面的文字處于第二個節點,以此類推。
!內容
!!同盟會的政治綱領是“驅除韃虜,恢復中華,創立民國,平均地權”。
!!孫中山將同盟會的綱領概括為三大主義,即民族主義、民權主義、民生主義,后被稱為三民主義。
!!!民族主義,即民族革命,包括“驅除韃虜,恢復中華”兩項內容。
!!!民權主義即政治革命,內容是“創立民國”,即建立資產階級民主共和國。
!!!民生主義即社會革命,指的是“平均地權”。
!評價:
!!它初步描繪出中國還不曾有過的資產階級共和國方案,是一個比較完整而明確的資產階級民主革命綱領。
!!對推動革命的發展產生了重大而積極的影響。
!!但它并不是一個徹底的資產階級民主革命綱領。
所以, 上面這段文字經過軟件處理后應該生成的樹狀圖應該如下:
常規思路在將文字轉化為圖片的過程中,如何將錄入文本轉化為一個結構化的數據至關重要。按照最容易想到的思路,算法設計應該是這樣:
在全文的最末尾加一個感嘆號,然后找出所有處于單個感嘆號之間的文字,放入一個數組中;
將數組中的第一個節點的文字提取出來,作為這個節點的title值保存下來,并且保存自己的父級的id(對于第一級的節點,父級節點id取-1),創建一個自己的id;
上述處理完畢之后,用遞歸的方式處理第二級、第三級……節點,直到全部遍歷完。
這就是我寫第一版程序時的思路,這個算法寫得很笨,也寫得很痛苦。層層遞歸的方式,在程序調試時不那么符合地球人的思維習慣。那種感覺很像是我們詬病Nodejs里的層層回調嵌套出現的“死亡金字塔”式的程序結構。
重新思考前些天閱讀過promise編程模式,很好的破解掉了這個“死亡金字塔”,讓代碼的結構非常便于閱讀和調試。受到這個啟發,再次思考了這個算法的設計,應該有一個調試起來思路更清楚,代碼結構更一目了然的方式:
首先不考慮感嘆號的多少,把感嘆號之間的文字提取出來,放入一個數組;
遍歷數組,將數組中每個元素創建為一個節點實例,實例包含如下屬性:id, title, level, parent, childrenids。id即自己在數組中的序號,title為自身文字,level即自身文字中包含感嘆號的數量。parent的算法稍復雜:尋找id和自己最接近且level比自己小1的節點,它的id即parent的值。childrenids暫時設為一個空數組。
上一步遍歷完成后,再次遍歷,根據parent值將各個節點的childrenids數組填寫好。
至此,所有節點的屬性值已經都具備。如果我們需要用一個json來結構化的表達這一組數據,那么只需要再次遍歷數組,創建一個json,將相應的值填充好就可以了。
下面是實現這個算法的代碼:
var str="!內容 !!同盟會的政治綱領是“驅除韃虜,恢復中華,創立民國,平均地權”。 !!孫中山將同盟會的綱領概括為三大主義,即民族主義、民權主義、民生主義,后被稱為三民主義。 !!!民族主義,即民族革命,包括“驅除韃虜,恢復中華”兩項內容。 !!!民權主義即政治革命,內容是“創立民國”,即建立資產階級民主共和國。 !!!民生主義即社會革命,指的是“平均地權”。 !評價: !!它初步描繪出中國還不曾有過的資產階級共和國方案,是一個比較完整而明確的資產階級民主革命綱領。!!對推動革命的發展產生了重大而積極的影響。 !!但它并不是一個徹底的資產階級民主革命綱領。"; //提取文字創建數組 var pt=/!+[^!]+(?=!)/g; var arr=str.match(pt); console.log(arr) //遍歷數組,將數組中每個元素創建為一個節點實例 var nodes=[]; for(var i in arr){ var obj={}; obj.id=i; var len=arr[i].length; obj.title=arr[i].replace(/!/g,""); obj.level=len-obj.title.length; if(obj.level==1)obj.parent=-1; else obj.parent=findparent(obj.level,obj.id).id; obj.childrenids=[]; nodes.push(obj); } //遍歷數組,為每個節點補上子節點集合 for(var i in nodes){ nodes[i].childrenids=findchildrenid(nodes[i].id); } //轉化為json數組 var json={ title:"三民主義學說和資產階級共和國方案", id:-1, parent:-1, level:-1, childrenids:findchildrenid(-1) } createjson(json,json.childrenids); function createjson(node,idarr){ var c=[]; for(var i in idarr){ c.push(findbyid(idarr[i])); } node.children=c; for(var i in c){ createjson(c[i],c[i].childrenids); } } console.log(JSON.stringify(json,null," ")) function findchildrenid(id){ var arr=[]; for(var i in nodes){ if(nodes[i].parent==id)arr.push(nodes[i].id); } return arr; } function findparent(level,id){ var parr=findbylevel(level-1); var n={},sub; for(var i in parr){ if(parr[i].id最后執行生成json的打印結果如下:
{ "title": "三民主義學說和資產階級共和國方案", "id": -1, "parent": -1, "level": -1, "childrenids": [ "0", "6" ], "children": [ { "id": "0", "title": "內容 ", "level": 1, "parent": -1, "childrenids": [ "1", "2" ], "children": [ { "id": "1", "title": "同盟會的政治綱領是“驅除韃虜,恢復中華,創立民國,平均地權”。 ", "level": 2, "parent": "0", "childrenids": [], "children": [] }, { "id": "2", "title": "孫中山將同盟會的綱領概括為三大主義,即民族主義、民權主義、民生主義,后被稱為三民主義。 ", "level": 2, "parent": "0", "childrenids": [ "3", "4", "5" ], "children": [ { "id": "3", "title": "民族主義,即民族革命,包括“驅除韃虜,恢復中華”兩項內容。 ", "level": 3, "parent": "2", "childrenids": [], "children": [] }, { "id": "4", "title": "民權主義即政治革命,內容是“創立民國”,即建立資產階級民主共和國。 ", "level": 3, "parent": "2", "childrenids": [], "children": [] }, { "id": "5", "title": "民生主義即社會革命,指的是“平均地權”。 ", "level": 3, "parent": "2", "childrenids": [], "children": [] } ] } ] }, { "id": "6", "title": "評價: ", "level": 1, "parent": -1, "childrenids": [ "7", "8" ], "children": [ { "id": "7", "title": "它初步描繪出中國還不曾有過的資產階級共和國方案,是一個比較完整而明確的資產階級民主革命綱領。", "level": 2, "parent": "6", "childrenids": [], "children": [] }, { "id": "8", "title": "對推動革命的發展產生了重大而積極的影響。 ", "level": 2, "parent": "6", "childrenids": [], "children": [] } ] } ] }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78322.html
摘要:可以這樣說,庫使得創建深度學習模型變得快速且簡單。在本教程中,你將了解如何用中更具靈活性的函數式來定義深度學習模型。如何使用函數式定義簡單的多層感知器卷積神經網絡以及循環神經網絡模型。 可以這樣說,Keras Python庫使得創建深度學習模型變得快速且簡單。序列API使得你能夠為大多數問題逐層創建模型。當然它也是有局限性的,那就是它并不能讓你創建擁有共享層或具有多個輸入或輸出的模型。Ker...
摘要:秋招變夏招,還沒準備好團隊成員收割機牽頭,帶領名成員歷時個月,整理了一份機器學習算法工程師求職面經。但如果之前并沒有意識到這一問題也沒關系,為你呈現一份小而美的面經。這部分內容包含了邏輯題目及概率題目兩方面的內容。 秋招變夏招,還沒準備好?Datawhale團隊成員offer收割機牽頭,帶領14名成員歷時2個月,整理了一份機器學習算法工程師求職面經:Daily-interview。一份...
摘要:程序員小吳打算使用動畫的形式來幫助理解遞歸,然后通過遞歸的概念延伸至理解動態規劃算法思想。因此,分治策略一般用來解決子問題相互對立的問題,稱為標準分治,而動態規劃用來解決子問題重疊的問題。難點就在于找出動態規劃中的這三個概念。 在學習「數據結構和算法」的過程中,因為人習慣了平鋪直敘的思維方式,所以「遞歸」與「動態規劃」這種帶循環概念(繞來繞去)的往往是相對比較難以理解的兩個抽象知識點。...
摘要:前端性能優化的涉及點從服務器到協議再到宿主環境本身都要有比較深刻的認識,業界目前主要還是以雅虎總結出來條前端性能優化的黃金軍規為參考。 歡迎大家前往騰訊云技術社區,獲取更多騰訊海量技術實踐干貨哦~ 導語 : 從事前端有6年+的時間了,從最開始的美工到重構再到偏向js邏輯開發的前端開發,一直在前端這個行業里面摸索和學習,我現在將自己這些年的一個心得體會來個系統性的梳理寫成一篇關于性能優化...
閱讀 2196·2021-11-15 11:36
閱讀 1366·2021-10-14 09:42
閱讀 4177·2021-09-30 09:52
閱讀 1689·2021-09-24 10:24
閱讀 941·2021-09-02 09:56
閱讀 2663·2019-08-30 13:11
閱讀 3042·2019-08-30 13:06
閱讀 929·2019-08-30 12:56