在平常的工做與學習中,咱們常常會使用思惟導圖這個工具,來把抽象而又無形的思考轉換成有形而且具體的圖像,是理清思路,梳理邏輯的一大神器。java
準確的說,思惟導圖並非一個具體的工具,而是一種方法。是道而不是術。實際落地時,咱們一般還須要藉助外部的工具。從最原始的紙和筆,到各類軟件,能夠說是應用盡有。目前我在使用的是 xmind 這款軟件,下面就會以 xmind 爲媒介間接的經過 Java 代碼畫思惟導圖。git
我在看書的時候有一個習慣,先經過思惟導圖畫出一本書的大綱,而後經過這個大綱來分主次的去閱讀。可能有些同窗感到疑惑,還沒讀過書,如何瞭解大綱呢?其實一本書的目錄就是這本書最好的大綱。github
本文經過把一個目錄生成思惟導圖的例子來學習 xmind 基本的 api 使用。固然若是想系統學習的同窗,能夠參考文末給出的官方 api 連接。下圖就是咱們最終要生成的結果。編程
xmind 最開始是在 eclipse 上進行定製開發而來(對,這個 eclipse 就是你在遇到 idea 後,喜新厭舊拋棄的那個編程軟件),因此天生就對 Java 有良好的支持。這個地址就是 xmind 在 github 上的倉庫。對 xmind 的操做的 api 全在 org.xmind.core 包下,按官方提示把代碼拉下來在本地打個包,再引入就 ok 了。可是呢?偷懶是第一輩子產力。立馬跑到 maven 倉庫搜索了一下,發現果真有人把官方的打包上傳了,直接拿來使用。(時間有點老,可是基本操做已經夠了,若是想用新功能,能夠拉代碼自行打包)api
<dependency> <groupid>com.github.eljah</groupid> <artifactid>xmindjbehaveplugin</artifactid> <version>0.8</version> </dependency>
咱們要生成思惟導圖,首先得有數據。這裏的數據就是一本書的目錄。瀏覽器
首先,書籍我選的是《一本書讀懂24種互聯網思惟》,選這本書,並非由於這本書有多好,而是由於他比較典型,典型就典型在,看過這本書的目錄後就沒有必要再讀這本書了,由於目錄已經把要說的內容說的很清楚了。eclipse
那知道書名,怎麼獲取書的目錄呢?很簡單,打開豆瓣,找到這本書的詳情,裏面就有書籍的目錄,直接把它 copy 下來就能夠了,目錄以下圖。maven
/* * * * * * * * blog.coder4j.cn * * * Copyright (C) 2016-2019 All Rights Reserved. * * * */ package cn.coder4j.study.example; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.ReUtil; import cn.hutool.system.SystemUtil; import com.google.common.collect.Lists; import org.xmind.core.Core; import org.xmind.core.CoreException; import org.xmind.core.ISheet; import org.xmind.core.ITopic; import org.xmind.core.IWorkbook; import org.xmind.core.IWorkbookBuilder; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * @author buhao * @version GeneratorDoubanXmind.java, v 0.1 2019-12-02 22:54 buhao */ public class GeneratorDoubanXmind { /** * 當前類路徑 */ public static final String CLASS_PATH = GeneratorDoubanXmind.class.getResource("/").getPath(); /** * 文件分隔符 */ public static final String FILE_SEPARATOR = SystemUtil.getOsInfo().getFileSeparator(); public static void main(String[] args) throws IOException, CoreException { // 讀取目錄 String bookName = "一本書讀懂24種互聯網思惟"; List<string> contents = FileUtil.readLines(CLASS_PATH + bookName + ".txt", "utf-8"); // 建立思惟導圖的工做空間 IWorkbookBuilder workbookBuilder = Core.getWorkbookBuilder(); IWorkbook workbook = workbookBuilder.createWorkbook(); // 得到默認sheet ISheet primarySheet = workbook.getPrimarySheet(); // 得到根主題 ITopic rootTopic = primarySheet.getRootTopic(); // 設置根主題的標題 rootTopic.setTitleText(bookName); // 章節 topic 的列表 ArrayList<itopic> chapterTopics = Lists.newArrayList(); for (String content : contents) { // 若是是數字開頭爲章節名稱 if (ReUtil.isMatch("^[1-24].*?", content)) { // 建立章節節點 ITopic topic = workbook.createTopic(); topic.setTitleText(content); chapterTopics.add(topic); } else { // 建立小節節點 ITopic topic = workbook.createTopic(); topic.setTitleText(content); chapterTopics.get(chapterTopics.size() - 1).add(topic, ITopic.ATTACHED); } } // 把章節節點添加到要節點上 chapterTopics.forEach(it -> rootTopic.add(it, ITopic.ATTACHED)); // 保存 workbook.save(CLASS_PATH + FILE_SEPARATOR + bookName + ".xmind"); } }
基本上代碼都作了註釋,對於核心代碼再簡單分析一下。ide
// 讀取目錄 String bookName = "一本書讀懂24種互聯網思惟"; List<string> contents = FileUtil.readLines(CLASS_PATH + bookName + ".txt", "utf-8");
首先前兩行沒必要說,我把目錄數據保存到了 resources 目錄下的 一本書讀懂24種互聯網思惟.txt,這兩行代碼就是簡單讀取數據。工具
// 建立思惟導圖的工做空間 IWorkbookBuilder workbookBuilder = Core.getWorkbookBuilder(); IWorkbook workbook = workbookBuilder.createWorkbook();
而後的兩行代碼,經過 Core 類建立工做空間構建者類,再經過它的 createWorkbook 方法建立出一個空白的工做空間,這個建立完就會獲得一個沒有任何節點的空白導圖。
// 得到默認sheet ISheet primarySheet = workbook.getPrimarySheet(); // 得到根主題 ITopic rootTopic = primarySheet.getRootTopic(); // 設置根主題的標題 rootTopic.setTitleText(bookName);
再接着,經過剛剛建立 工做空間 獲得主 sheet,這個 sheet 跟 excel 的概念差很少,就像瀏覽器的一個 tab 同樣。效果以下圖
另外還經過主 sheet 得到了根 topic,並設置他的標題爲書名,它對應下圖
// 章節 topic 的列表 ArrayList<itopic> chapterTopics = Lists.newArrayList(); for (String content : contents) { // 若是是數字開頭爲章節名稱 if (ReUtil.isMatch("^[1-24].*?", content)) { // 建立章節節點 ITopic topic = workbook.createTopic(); topic.setTitleText(content); chapterTopics.add(topic); } else { // 建立小節節點 ITopic topic = workbook.createTopic(); topic.setTitleText(content); chapterTopics.get(chapterTopics.size() - 1).add(topic, ITopic.ATTACHED); } }
這段代碼比較多,可是重點是建立 topic 的操做,每一個 topic 就是思惟導圖的一個節點,能夠經過 workbook.createTopic() 來建立,一樣的經過 setTitleText 設置標題。這段代碼實際上是分析了目錄的規律,有1-24開頭的是大章節,然後面緊跟的是小章節,一個大章節下是多個小章節(能夠看上面的目錄截圖)。因此判斷是大章節就建立一個新的節點,判斷是小章節就往最後一個大章節上添加(經過 add 方法)。
// 把章節節點添加到要節點上 chapterTopics.forEach(it -> rootTopic.add(it, ITopic.ATTACHED));
剛纔說了把小章節都添加到了大章節上了,可是大章節如今仍是無依無靠的,因此經過一個循環所有添加到了根 Topic 上。
// 保存 workbook.save(CLASS_PATH + FILE_SEPARATOR + bookName + ".xmind");
到此咱們編碼結束了,可是這些操做還在內存中,咱們須要經過 workbook 的 save 方法把文件保存到硬盤上,另外文件後綴記得改爲 xmind,不然軟件沒法識別。
由於篇幅有限,沒法貼完全部代碼,如遇到問題可到相關連接裏面的 example 上,查看源碼。
</itopic></string></itopic></string>