List数据按照树状结构(tree)进行排序


一般应用我们都是把数据直接转成树状结构。这个可以通过sql实现,但是也有用到只按照树状结构排序的情况。(适用于网站栏目设置,并且可以排序这样的功能)

以下代码是整理自网上的,以供参考:

1、一个Bean,用于模仿我们平时接收数据的实体类

public class MyTestTree {
	private int id;

	private String name;

	private int parentId;
	
	private int no_order;

	private List<MyTestTree> childrens;

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

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getParentId() {
		return parentId;
	}

	public void setParentId(int parentId) {
		this.parentId = parentId;
	}

	public List<MyTestTree> getChildrens() {
		return childrens;
	}

	public void setChildrens(List<MyTestTree> childrens) {
		this.childrens = childrens;
	}

	public int getNo_order() {
		return no_order;
	}

	public void setNo_order(int no_order) {
		this.no_order = no_order;
	}
}

2、使用测试数据进行排序

public class TestListTree {

	public static void main(String[] args) {
		// id,pid(父节点),name(节点名称),sequence(同级节点排序依据)
		MyTestTree tree1 = new MyTestTree(1, "顶层节点1", 0, 1);
		MyTestTree tree2 = new MyTestTree(2, "顶层节点2", 0, 2);
		MyTestTree tree3 = new MyTestTree(3, "顶层节点3", 0, 3);

		MyTestTree tree4 = new MyTestTree(4, "二级节点4", 1, 1);
		MyTestTree tree5 = new MyTestTree(5, "二级节点5", 2, 2);
		MyTestTree tree6 = new MyTestTree(6, "二级节点6", 3, 3);

		MyTestTree tree7 = new MyTestTree(7, "三级节点7", 4, 1);
		MyTestTree tree8 = new MyTestTree(8, "三级节点8", 4, 2);
		MyTestTree tree9 = new MyTestTree(9, "三级节点9", 5, 1);

		List<MyTestTree> list = new ArrayList<MyTestTree>();
		list.add(tree1);
		list.add(tree2);
		list.add(tree3);
		list.add(tree4);
		list.add(tree5);
		list.add(tree6);
		list.add(tree7);
		list.add(tree8);
		list.add(tree9);

		LinkedList<MyTestTree> result = new LinkedList<MyTestTree>();
		LinkedList<MyTestTree> f = toSort(list, result, 0);
		for (int i = 0; i < f.size(); i++) {
			System.out.print(f.get(i).getId() + ",");
			System.out.print(f.get(i).getName() + ",");
			System.out.print(f.get(i).getParentId() + ",");
			System.out.println(f.get(i).getNo_order());
		}
	}
	
	/**
	 * 
	 * @Description: 排序
	 * @param list
	 * @param result
	 * @param father
	 * @return
	 * LinkedList<MyTestTree>
	 */
	private static LinkedList<MyTestTree> toSort(List<MyTestTree> list,
			LinkedList<MyTestTree> result, int father) {
		List<MyTestTree> temp = new ArrayList<MyTestTree>();
		// 最高层,临时存放
		for (int i = 0; i < list.size(); i++) {
			if (list.get(i).getParentId() == father) {
				temp.add(list.get(i));
			}
		}

		if (temp.size() < 1) {
			return result;
		} else { 
			// 删除最高层
			for (int j = 0; j < list.size(); j++) {
				if (list.get(j).getParentId() == father) {
					list.remove(j);
				}
			}
			// 对最高层排序
			for (int i = 0; i < temp.size() - 1; i++) {
				for (int j = i + 1; j < temp.size(); j++) {
					if (temp.get(i).getNo_order() > temp.get(j).getNo_order()) {
						MyTestTree myTestTree = temp.get(i);
						temp.set(i, temp.get(j));
						temp.set(j, myTestTree);
					}
				}
			}
			// 递归
			for (int i = 0; i < temp.size(); i++) {
				result.add(temp.get(i));
				toSort(list, result, temp.get(i).getId());
			}
			return result;
		}

	}
}


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
如果你的数据树状结构,可以使用递归查询的方式来实现返回树状结构数据。下面是一个简单的示例代码,假设你有一个名为Category的实体类,其中包含了id、name、parentId等属性: ```java @Entity @Table(name = "category") public class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @Column(name = "parent_id") private Long parentId; // 省略getter和setter方法 } ``` 在Spring Boot中,你可以使用JPA的@Query注解来编写自定义的SQL语句。下面是一个查询返回树状结构数据的例子: ```java public interface CategoryRepository extends JpaRepository<Category, Long> { @Query(nativeQuery = true, value = "WITH RECURSIVE category_tree(id, name, parent_id, level, path) AS ( " + "SELECT id, name, parent_id, 0 as level, CAST(id AS CHAR(200)) as path " + "FROM category " + "WHERE parent_id IS NULL " + "UNION ALL " + "SELECT c.id, c.name, c.parent_id, ct.level + 1 as level, CONCAT(ct.path, '->', c.id) as path " + "FROM category c " + "JOIN category_tree ct ON c.parent_id = ct.id " + ") " + "SELECT id, name, parent_id, level, path FROM category_tree ORDER BY path") List<Object[]> findCategoryTree(); } ``` 这个查询使用了MySQL的递归查询语法,将树状结构数据转换成了扁平化的表格数据。查询结果是一个List<Object[]>,其中每个Object[]表示一条记录,包含了id、name、parent_id、level和path五个字段。其中,path字段是用来在查询结果中排序的,它的值类似于 "1->2->3",表示层级关系。你可以通过遍历查询结果,将其转换成树形结构数据
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值