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

需求

  • 最近在做一个导出数据生成树节点的工作 ,从数据库中导出全国省市区街道数据,查询出来是 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) {

        List<DicTree> dicList = new ArrayList<>();
        dicList.add(new DicTree(1, "测试1", 0));
        dicList.add(new DicTree(2, "测试2", 1));
        dicList.add(new DicTree(3, "测试3", 2));
        dicList.add(new DicTree(4, "测试4", 0));
        List<DicTree> dicTrees = test3(dicList);
        System.out.println(dicTrees.toString());
    }

    public static List<DicTree> test3(List<DicTree> dicList) {
//        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
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值