java 将查询结果集转为树形结构

在需要使用树形菜单的时候,z-tree是可以直接传数据父级id 对应子集pid自动生成树形结构,但z-tree这个框架毕竟年级较大了大家都知道年纪大的人都长得丑毕竟像我这么年轻才能天下第一帅,在使用很多树形控件时候需要的数据格式是固定的也就是子集需要在父级的一个集合属性里。(好了,可能是我们的前端太菜了不会写,非逼着我转结构)

比如

这样就需要我们在后台将数据处理成指定格式在转成json了比如我们要查一个省的数据,河南省下面有郑州市、开封市、洛阳市、驻马店市、等等,然后郑州市下面还有金水区、惠济区、二七区等等,我们可以用递归查询查询出河南省下所有的地方,但是我们查询出来的是一个结果集要怎么才能转换成这样的数据

package com.synergy.util;

import cn.hutool.core.collection.IterUtil;
import cn.hutool.core.util.StrUtil;


import java.util.*;

/**
 * 将查询的pageData转换成树形结构
 *  父级id为pid 本级id
 */
public class PageToTreeUtil {


	/**
	 * 工具类不允许实例化
	 */
	private PageToTreeUtil() {
	}

	static List<PageData> returnList = new ArrayList<>();

	/**
	 * 根据父节点的ID获取所有子节点
	 *
	 * @param list      需要转换的数据
	 * @param sort      排序码的名称
	 * @param lowerName 子集名称
	 * @param superId   一级id
	 */
	public static List<PageData> getChildPerms(List<PageData> list, String sort, String lowerName, String superId) {
		if (list == null) {
			return null;
		}
		List<PageData> childList = getChildList(list, sort, superId);
		for (int i = 0; i < list.size(); i++) {
			if (list.get(i).get("id").equals(superId)) {
				PageData remove = list.remove(i);
				if (StrUtil.isBlank(lowerName)) {
					remove.put("list", childList);
				} else {
					remove.put(lowerName, childList);
				}
				returnList.add(remove);
				break;//找到一级跳出循环
			}
		}

		for (PageData pageData : childList) {
			if (IterUtil.isEmpty(list)) {
				break;
			}

			recursionFn(list, sort, lowerName, pageData);
		}

		return returnList;
	}

	/**
	 * 递归出所有的子集菜单
	 * @param list 查询的结果集
	 * @param sort 排序列名
	 * @param lowerName 子集name
	 * @param superdata  相对一级
	 */
	private static void recursionFn(List<PageData> list, String sort, String lowerName, PageData superdata) {
		List<PageData> list1 = getChildList(list, sort, superdata.get("id").toString());
		if (IterUtil.isNotEmpty(list1)) {
			if (StrUtil.isBlank(lowerName)) {
				superdata.put("list", list1);// 未定义子集名称使用list
			} else {
				superdata.put(lowerName, list1);
			}
			for (PageData pageData : list1) {
				if (IterUtil.isEmpty(list)) {
					break;
				}
				recursionFn(list, sort, lowerName, pageData);
			}

		}
	}

	/**
	 * 得到子节点列表
	 */
	private static List<PageData> getChildList(List<PageData> list, String sort, String superId) {

		List<PageData> tlist = new ArrayList<>();
		Iterator<PageData> it = list.iterator();
		for (int i = 0; i < list.size(); i++) {
			if (list.get(i).get("pid").equals(superId)) {
				tlist.add(list.remove(i));
				i--;
			}
		}
		try {
			if (StrUtil.isNotBlank(sort)) {
				Collections.sort(tlist, new Comparator<PageData>() {
					@Override
					public int compare(PageData o1, PageData o2) {
						return Integer.valueOf(o1.get(superId).toString()) - Integer.valueOf(o2.get(superId).toString());
					}
				});
			}
		} catch (Exception e) {//排序码为字符了无法排序
			e.printStackTrace();
		}

		return tlist;
	}

}

我的代码里使用了hutool来做了一些判断,你们如果不想加hutool的工具包也可以改一下,但是我强烈推荐hutool。我的pageData是封装的一个map对象你们查询的时候直接返回map就可以

好了,写好没测,谁用谁测,反正坑的不是我

 


2021年更新,果然还是没眼看自己以前的代码,转Tree是没有必要用递归的。

    /**
     * 将列表转换成tree
     *
     * @param list 菜单集合
     * @return Tree形菜单
     */
    @Override
    public List<Menu> buildTree(List<Menu> list) {
        List<Menu> trees = new ArrayList<>();
        for (Menu menuDTO : list) {
            if (SysConstants.MAXMENUPID.equals(menuDTO.getPid())) {
                trees.add(menuDTO);
            }
            for (Menu it : list) {
                if (menuDTO.getId().equals(it.getPid())) {
                    if (menuDTO.getChildren() == null) {
                        menuDTO.setChildren(new ArrayList<>());
                    }
                    menuDTO.getChildren().add(it);
                }
            }
            // 按照排序码进行排序
            List<Menu> children = menuDTO.getChildren();
            if (IterUtil.isNotEmpty(children)) {
                children.sort(Comparator.comparingInt(Menu::getSortid));
            }
        }
        // 排序
        trees.sort(Comparator.comparingInt(Menu::getSortid));
        return trees;
    }

 

您可以使用递归的方式将List年级、班级和课程转换为树形结构。以下是一个示例的Java代码: ```java import java.util.ArrayList; import java.util.List; class TreeNode { private String name; private List<TreeNode> children; public TreeNode(String name) { this.name = name; this.children = new ArrayList<>(); } public void addChild(TreeNode child) { this.children.add(child); } public String getName() { return name; } public List<TreeNode> getChildren() { return children; } } class Course { private String name; public Course(String name) { this.name = name; } public String getName() { return name; } } public class Main { public static void main(String[] args) { // 创建年级、班级和课程列表 List<String> grades = List.of("Grade 1", "Grade 2"); List<String> classes = List.of("Class A", "Class B"); List<String> courses = List.of("Math", "English", "Science"); // 转换为树形结构 TreeNode root = new TreeNode("Root"); for (String grade : grades) { TreeNode gradeNode = new TreeNode(grade); for (String clazz : classes) { TreeNode classNode = new TreeNode(clazz); for (String course : courses) { TreeNode courseNode = new TreeNode(course); classNode.addChild(courseNode); } gradeNode.addChild(classNode); } root.addChild(gradeNode); } // 打印树形结构 printTree(root, 0); } private static void printTree(TreeNode node, int level) { StringBuilder indent = new StringBuilder(); for (int i = 0; i < level; i++) { indent.append(" "); } System.out.println(indent + node.getName()); for (TreeNode child : node.getChildren()) { printTree(child, level + 1); } } } ``` 在上述代码中,我们创建了一个`TreeNode`类来表示树的节点,每个节点有一个名称和一个子节点列表。我们还创建了一个`Course`类来表示课程。 在`Main`类的`main`方法中,我们使用三个列表来表示年级、班级和课程。然后,我们使用嵌套的循环来将它们转换为树形结构。最后,我们使用递归的方式打印出整个树形结构。 注意:这只是一个示例代码,您可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值