程序员の奇妙冒险

返回
Java Java
2018-07-21 18:58 阅读:52 评论:0

java 非递归list转换为树tree型结构

需求 最近在做一个导出数据生成树节点的工作 ,从数据库中导出全国省市区街道数据,查询出来是 list集合需要转换成树 tree 表 大概有这几个字段 CREATE TABLE dic ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(63) NOT...

                    <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/markdown_views-a5d25dd831.css">
                    <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mobile/css/edit_views_md-250d69367f.min.css">
                    <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/style-e504d6a974.css">
                    <h3><a id="_0"></a>需求</h3> 
  • 最近在做一个导出数据生成树节点的工作 ,从数据库中导出全国省市区街道数据,查询出来是 list集合需要转换成树 tree

  • 大概有这几个字段
CREATE TABLE dic (
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(63) NOT NULL,
  parent_id int(11) NOT NULL,
) ;

代码

DicTree类

import java.util.ArrayList;
import java.util.List;

/**

  • @author czw

  • @description: 城市字典-树 */ public class DicTree {

    /**

    • 节点id */ private int id;

    /**

    • 城市名称 */ private String name;

    /**

    • 父级id */ private int parentId;

    /**

    • 子节点 */ private List<DicTree> child = new ArrayList();

    /**

    • 当前属于第几级节点 */ private int node;

    public DicTree(){

    }

    public DicTree(int id, String name, int parentId) { this.id = id; this.name = name; this.parentId = parentId; }

    /省略get/set/ }

运行代码

   @Test
   public void test3() {
       List<DicTree> dicList = dicDao.getDicData();
       List<DicTree> rootTrees = new ArrayList<DicTree>();
   for (DicTree dicTree : dicList) {
       if (dicTree.getParentId() == 0) {
           rootTrees.add(dicTree);
       }

       for (DicTree childrenDicTree : dicList) {
        /**
         * 这里只要三级节点,如果不限制子节点个数,去掉 dicTree.getNode()判断
         */
       	if (dicTree.getId() == childrenDicTree.getParentId() &amp;&amp; dicTree.getNode() &lt; 2) {
               if (dicTree.getChild() == null || dicTree.getChild().size() == 0) {
                   List&lt;DicTree&gt; myChildrens = new ArrayList&lt;DicTree&gt;();
                   myChildrens.add(childrenDicTree);
                   dicTree.setChild(myChildrens);
               } else {
                   dicTree.getChild().add(childrenDicTree);
               }

           }
       }

   }
   System.out.println("开始写出文件.......");
   try {
       File file = new File("/mnt/dic/dic10028.json");
       PrintStream ps = new PrintStream(new FileOutputStream(file));
       /**
        * 防止 fastjson把对象转化成json出现 $ref,加上 SerializerFeature.DisableCircularReferenceDetect
        */
       ps.println(JSON.toJSONString(rootTrees, SerializerFeature.DisableCircularReferenceDetect));
   } catch (FileNotFoundException e) {
       e.printStackTrace();
   }
   System.out.println("写出完毕.......");

}

优化版


    public static void main(String[] args) {
    <span class="token class-name">List</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">DicTree</span><span class="token punctuation">&gt;</span></span> dicList <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ArrayList</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token punctuation">&gt;</span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    dicList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">DicTree</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token string">"测试1"</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    dicList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">DicTree</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token string">"测试2"</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    dicList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">DicTree</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token string">"测试3"</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    dicList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">DicTree</span><span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">,</span> <span class="token string">"测试4"</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token class-name">List</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">DicTree</span><span class="token punctuation">&gt;</span></span> dicTrees <span class="token operator">=</span> <span class="token function">test3</span><span class="token punctuation">(</span>dicList<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>dicTrees<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token class-name">List</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">DicTree</span><span class="token punctuation">&gt;</span></span> <span class="token function">test3</span><span class="token punctuation">(</span><span class="token class-name">List</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">DicTree</span><span class="token punctuation">&gt;</span></span> dicList<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>

// List<DicTree> dicList = dicDao.getDicData(); if (dicList.size() == 1) { return dicList; } // 记录需要从 deptList 集合中移除的子节点对象 List<Integer> removeList = new ArrayList<>(); for (DicTree dicTree : dicList) { for (DicTree childrenDicTree : dicList) { /** * 这里只要三级节点,如果不限制子节点个数,去掉 dicTree.getNode()判断 */ if (dicTree.getId() == childrenDicTree.getParentId() && dicTree.getNode() < 2) { if (dicTree.getChild() == null || dicTree.getChild().size() == 0) { List<DicTree> myChildrens = new ArrayList<>(); removeList.add(childrenDicTree.getId()); myChildrens.add(childrenDicTree); dicTree.setChild(myChildrens); } else { removeList.add(childrenDicTree.getId()); dicTree.getChild().add(childrenDicTree); } } } } //如果是子节点,则已经移入到父级下面,因此需要从集合中移除 for (int i = 0; i < dicList.size(); i++) { DicTree item = dicList.get(i); if (removeList.contains(item.getId())) { dicList.remove(item); i--; } } return dicList; }

  • 这种遍历就不需要考虑parentId是否为0
评论 (0)
暂无评论 来抢沙发吧~