由父id(parentId、pId)和id构建的树型结构数据,按结构顺序进行排序,并输出成一个集合。

唠叨几句

  • 最近在工作中碰见树结构需要排序情况,因为树的结构在数据库中可能是顺序的也可能是乱序的,对于这些乱序的数据,它们通过父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
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值