唠叨几句
- 最近在工作中碰见树结构需要排序情况,因为树的结构在数据库中可能是顺序的也可能是乱序的,对于这些乱序的数据,它们通过父ID字段互相关联,又彼此有了关系。这次是通过链表LinkedList的特性和方法,实现了树结构排序的功能。
心累了,就放手;疲惫了,就眯一觉。——李朵
代码和逻辑比较简单,有疑问和指摘,可以直接在评论处发言。
代码
package cn.ban.demo;
import cn.ban.demo.model.treeEntity;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
public class treeSort {
public static void main(String[] args) {
List<treeEntity> treeData = getData();
System.out.println("最初的集合:");
treeData.forEach(p-> System.out.println(p.toString()));
Collections.shuffle(treeData);
System.out.println("洗牌后的集合:");
treeData.forEach(p-> System.out.println(p.toString()));
List<treeEntity> resList = sortTreeList(treeData);
System.out.println("排序后的集合:");
resList.forEach(p-> System.out.println(p.toString()));
}
private static List<treeEntity> getData(){
List<treeEntity> resList = new ArrayList<>();
resList.add(treeEntity.builder().id(1).no("10000").parentId(0).name("汽车").rootId(1).build());
resList.add(treeEntity.builder().id(2).no("10000-1").parentId(1).name("方向盘").rootId(1).build());
resList.add(treeEntity.builder().id(3).no("10000-2").parentId(1).name("座椅").rootId(1).build());
resList.add(treeEntity.builder().id(4).no("10000-3").parentId(1).name("轮胎").rootId(1).build());
resList.add(treeEntity.builder().id(5).no("10000-4").parentId(2).name("方向盘-按钮").rootId(1).build());
resList.add(treeEntity.builder().id(6).no("10000-5").parentId(2).name("方向盘-保护壳").rootId(1).build());
resList.add(treeEntity.builder().id(7).no("10000-6").parentId(2).name("方向盘-安全气囊").rootId(1).build());
resList.add(treeEntity.builder().id(8).no("10000-7").parentId(3).name("座椅-真皮外套").rootId(1).build());
resList.add(treeEntity.builder().id(9).no("10000-8").parentId(3).name("座椅-海绵内芯").rootId(1).build());
resList.add(treeEntity.builder().id(10).no("10000-9").parentId(4).name("轮胎-外胎").rootId(1).build());
resList.add(treeEntity.builder().id(11).no("10000-10").parentId(4).name("轮胎-内胎").rootId(1).build());
resList.add(treeEntity.builder().id(12).no("10000-11").parentId(5).name("按钮-二极管").rootId(1).build());
resList.add(treeEntity.builder().id(13).no("10000-12").parentId(5).name("按钮-电阻").rootId(1).build());
resList.add(treeEntity.builder().id(14).no("10000-13").parentId(5).name("按钮-电容").rootId(1).build());
return resList;
}
private static List<treeEntity> sortTreeList(List<treeEntity> treeList) {
// 把所有根节点取出
LinkedList<treeEntity> rootLinks = treeList.stream()
.filter(p -> p.getParentId() == 0).collect(Collectors.toCollection(LinkedList::new));
List<treeEntity> sortList = new ArrayList<>();
List<treeEntity> childList;
while (!rootLinks.isEmpty()) {
// 弹出
treeEntity top = rootLinks.removeFirst();
sortList.add(top);
childList = new ArrayList<>();
for (treeEntity item : treeList) {
if (Objects.equals(item.getParentId(), top.getId())) {
childList.add(item);
}
}
// 放在开头, 同时根据id排序(升序)
rootLinks.addAll(0, childList.stream().sorted(Comparator.comparing(treeEntity::getId)).toList());
}
return sortList;
}
}
package cn.ban.demo.model;
import java.util.StringJoiner;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class treeEntity {
private int id;
private String no;
private int parentId;
private int rootId;
private String name;
@Override
public String toString() {
return new StringJoiner(", ", treeEntity.class.getSimpleName() + "[", "]")
.add("id=" + id)
.add("no='" + no + "'")
.add("parentId=" + parentId)
.add("rootId=" + rootId)
.add("name='" + name + "'")
.toString();
}
}
控制台结果
最初的集合:
treeEntity[id=1, no='10000', parentId=0, rootId=1, name='汽车']
treeEntity[id=2, no='10000-1', parentId=1, rootId=1, name='方向盘']
treeEntity[id=3, no='10000-2', parentId=1, rootId=1, name='座椅']
treeEntity[id=4, no='10000-3', parentId=1, rootId=1, name='轮胎']
treeEntity[id=5, no='10000-4', parentId=2, rootId=1, name='方向盘-按钮']
treeEntity[id=6, no='10000-5', parentId=2, rootId=1, name='方向盘-保护壳']
treeEntity[id=7, no='10000-6', parentId=2, rootId=1, name='方向盘-安全气囊']
treeEntity[id=8, no='10000-7', parentId=3, rootId=1, name='座椅-真皮外套']
treeEntity[id=9, no='10000-8', parentId=3, rootId=1, name='座椅-海绵内芯']
treeEntity[id=10, no='10000-9', parentId=4, rootId=1, name='轮胎-外胎']
treeEntity[id=11, no='10000-10', parentId=4, rootId=1, name='轮胎-内胎']
treeEntity[id=12, no='10000-11', parentId=5, rootId=1, name='按钮-二极管']
treeEntity[id=13, no='10000-12', parentId=5, rootId=1, name='按钮-电阻']
treeEntity[id=14, no='10000-13', parentId=5, rootId=1, name='按钮-电容']
洗牌后的集合:
treeEntity[id=6, no='10000-5', parentId=2, rootId=1, name='方向盘-保护壳']
treeEntity[id=9, no='10000-8', parentId=3, rootId=1, name='座椅-海绵内芯']
treeEntity[id=3, no='10000-2', parentId=1, rootId=1, name='座椅']
treeEntity[id=14, no='10000-13', parentId=5, rootId=1, name='按钮-电容']
treeEntity[id=10, no='10000-9', parentId=4, rootId=1, name='轮胎-外胎']
treeEntity[id=7, no='10000-6', parentId=2, rootId=1, name='方向盘-安全气囊']
treeEntity[id=2, no='10000-1', parentId=1, rootId=1, name='方向盘']
treeEntity[id=13, no='10000-12', parentId=5, rootId=1, name='按钮-电阻']
treeEntity[id=11, no='10000-10', parentId=4, rootId=1, name='轮胎-内胎']
treeEntity[id=8, no='10000-7', parentId=3, rootId=1, name='座椅-真皮外套']
treeEntity[id=12, no='10000-11', parentId=5, rootId=1, name='按钮-二极管']
treeEntity[id=1, no='10000', parentId=0, rootId=1, name='汽车']
treeEntity[id=4, no='10000-3', parentId=1, rootId=1, name='轮胎']
treeEntity[id=5, no='10000-4', parentId=2, rootId=1, name='方向盘-按钮']
排序后的集合:
treeEntity[id=1, no='10000', parentId=0, rootId=1, name='汽车']
treeEntity[id=2, no='10000-1', parentId=1, rootId=1, name='方向盘']
treeEntity[id=5, no='10000-4', parentId=2, rootId=1, name='方向盘-按钮']
treeEntity[id=12, no='10000-11', parentId=5, rootId=1, name='按钮-二极管']
treeEntity[id=13, no='10000-12', parentId=5, rootId=1, name='按钮-电阻']
treeEntity[id=14, no='10000-13', parentId=5, rootId=1, name='按钮-电容']
treeEntity[id=6, no='10000-5', parentId=2, rootId=1, name='方向盘-保护壳']
treeEntity[id=7, no='10000-6', parentId=2, rootId=1, name='方向盘-安全气囊']
treeEntity[id=3, no='10000-2', parentId=1, rootId=1, name='座椅']
treeEntity[id=8, no='10000-7', parentId=3, rootId=1, name='座椅-真皮外套']
treeEntity[id=9, no='10000-8', parentId=3, rootId=1, name='座椅-海绵内芯']
treeEntity[id=4, no='10000-3', parentId=1, rootId=1, name='轮胎']
treeEntity[id=10, no='10000-9', parentId=4, rootId=1, name='轮胎-外胎']
treeEntity[id=11, no='10000-10', parentId=4, rootId=1, name='轮胎-内胎']
Process finished with exit code 0