【xmind】 使用 Java 生成思惟導圖

image.png

前言

在平常的工做與學習中,咱們常常會使用思惟導圖這個工具,來把抽象而又無形的思考轉換成有形而且具體的圖像,是理清思路,梳理邏輯的一大神器。java

準確的說,思惟導圖並非一個具體的工具,而是一種方法。是道而不是術。實際落地時,咱們一般還須要藉助外部的工具。從最原始的紙和筆,到各類軟件,能夠說是應用盡有。目前我在使用的是 xmind 這款軟件,下面就會以 xmind 爲媒介間接的經過 Java 代碼畫思惟導圖。git

放碼過來

經過目錄生成思惟導圖

我在看書的時候有一個習慣,先經過思惟導圖畫出一本書的大綱,而後經過這個大綱來分主次的去閱讀。可能有些同窗感到疑惑,還沒讀過書,如何瞭解大綱呢?其實一本書的目錄就是這本書最好的大綱。github

本文經過把一個目錄生成思惟導圖的例子來學習 xmind 基本的 api 使用。固然若是想系統學習的同窗,能夠參考文末給出的官方 api 連接。下圖就是咱們最終要生成的結果。編程

image.png

引入依賴

 xmind 最開始是在 eclipse 上進行定製開發而來(對,這個 eclipse 就是你在遇到 idea 後,喜新厭舊拋棄的那個編程軟件),因此天生就對 Java 有良好的支持。這個地址就是 xmind 在 github 上的倉庫。對 xmind 的操做的 api 全在 org.xmind.core 包下,按官方提示把代碼拉下來在本地打個包,再引入就 ok 了。可是呢?偷懶是第一輩子產力。立馬跑到 maven 倉庫搜索了一下,發現果真有人把官方的打包上傳了,直接拿來使用。(時間有點老,可是基本操做已經夠了,若是想用新功能,能夠拉代碼自行打包)api

  • pom.xml
<dependency>
  <groupid>com.github.eljah</groupid>
  <artifactid>xmindjbehaveplugin</artifactid>
  <version>0.8</version>
</dependency>

準備數據

咱們要生成思惟導圖,首先得有數據。這裏的數據就是一本書的目錄。瀏覽器

首先,書籍我選的是《一本書讀懂24種互聯網思惟》,選這本書,並非由於這本書有多好,而是由於他比較典型,典型就典型在,看過這本書的目錄後就沒有必要再讀這本書了,由於目錄已經把要說的內容說的很清楚了。eclipse

那知道書名,怎麼獲取書的目錄呢?很簡單,打開豆瓣,找到這本書的詳情,裏面就有書籍的目錄,直接把它 copy 下來就能夠了,目錄以下圖。maven

image.png

開始編碼

  • GeneratorDoubanXmind
/*
 *
 *  * *
 *  *  * 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 -&gt; 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 同樣。效果以下圖

image.png

另外還經過主 sheet 得到了根 topic,並設置他的標題爲書名,它對應下圖

image.png

// 章節 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 -&gt; rootTopic.add(it, ITopic.ATTACHED));

剛纔說了把小章節都添加到了大章節上了,可是大章節如今仍是無依無靠的,因此經過一個循環所有添加到了根 Topic 上。

// 保存
        workbook.save(CLASS_PATH + FILE_SEPARATOR + bookName + ".xmind");

到此咱們編碼結束了,可是這些操做還在內存中,咱們須要經過 workbook 的 save 方法把文件保存到硬盤上,另外文件後綴記得改爲 xmind,不然軟件沒法識別。

其它

說明

由於篇幅有限,沒法貼完全部代碼,如遇到問題可到相關連接裏面的 example 上,查看源碼。

相關連接

  1. xmind api 地址
  2. study-xmind-example

image.png </itopic></string></itopic></string>

相關文章
相關標籤/搜索