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() && dicTree.getNode() < 2) { if (dicTree.getChild() == null || dicTree.getChild().size() == 0) { List<DicTree> myChildrens = new ArrayList<DicTree>(); 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"><</span><span class="token class-name">DicTree</span><span class="token punctuation">></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"><</span><span class="token punctuation">></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"><</span><span class="token class-name">DicTree</span><span class="token punctuation">></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"><</span><span class="token class-name">DicTree</span><span class="token punctuation">></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"><</span><span class="token class-name">DicTree</span><span class="token punctuation">></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