【二次封装】之树级结构排序. 拿来即用. 根据 id, parentId 对对象进行树级结构排序. 就是在前人的模板基础上, 进行了泛型化.

这段代码展示了如何使用Java对A类对象列表进行重排序,并根据id和parentId计算层级关系。通过`reorderAndOpen`方法,实现了对象的展开与层次结构展示。关键部分包括`reorder`和`openTree`函数,用于排序和递归遍历子节点。
摘要由CSDN通过智能技术生成
public class Test {

    @Getter
    @Setter
    @ToString
    public static class A {
        private String id;
        private String pId;
    }

	//重排序并进行展开
    protected static <T, K> List<T> reorderAndOpen(List<T> oldList,
                                     Function<? super T, ? extends K> keyMapper,
                                     Function<? super T, ? extends K> parentMapper,
                                     BinaryOperator<T> mergeFunction) {
        Map<K, T> tMapByk = oldList.stream().collect(Collectors.toMap(keyMapper, Function.identity(), mergeFunction));

        List<T> treeList = new ArrayList<>();

        Map<K, List<T>> childMap = new HashMap<>();

        tMapByk.values().stream().forEach((t) -> {
            K parentK = parentMapper.apply(t);
            K own = keyMapper.apply(t);

            if (!own.equals(parentK)) {
                //自己的父类不能是自己
                T parentT = tMapByk.get(parentK);
                if (null == parentT) {
                    //如果父类是空的, 或者在该 Lis 中 没有知道, 那么, 就判定自己就是顶级父类
                    treeList.add(t);
                } else {
                    List<T> childList = childMap.get(parentK);
                    if (null == childList) {
                        childList = new ArrayList<>();
                    }
                    childList.add(t);
                    childMap.put(parentK, childList);
                }
            }
        });

        List<T> openTreeList = new ArrayList<>();
        openTree(treeList, childMap, keyMapper, openTreeList);
        return openTreeList;
    }

    protected static <T, K> void openTree(List<T> treeList,
                                   Map<K, List<T>> childMap,
                                   Function<? super T, ? extends K> keyMapper,
                                   List<T> openTreeList) {
        if (treeList != null) {
            for (T t : treeList) {
                openTreeList.add(t);
                System.out.println("父: " + JsonUtils.toJsonString(t));
                List<T> childList = childMap.get(keyMapper.apply(t));
                System.out.println("子: " + JsonUtils.toJsonString(childList));
                openTree(childList, childMap, keyMapper, openTreeList);
            }
        }
    }

    public static void main(String[] args) {
        A a = new A();
        a.setId("0");

        A a1 = new A();
        a1.setId("1");
        a1.setPId("0");

        A a2 = new A();
        a2.setId("2");
        a2.setPId("0");

        A a3 = new A();
        a3.setId("3");
        a3.setPId("1");

        A a4 = new A();
        a4.setId("4");
        a4.setPId("1");

        A a5 = new A();
        a5.setId("5");
        a5.setPId("1");

        A a6 = new A();
        a6.setId("6");
        a6.setPId("2");

        A a7 = new A();
        a7.setId("7");
        a7.setPId("0");

        A a8 = new A();
        a8.setId("8");
        a8.setPId("6");

        A a9 = new A();
        a9.setId("9");
        a9.setPId("4");

        List<A> aList = new ArrayList<>();
        aList.add(a);
        aList.add(a1);
        aList.add(a2);
        aList.add(a3);
        aList.add(a4);
        aList.add(a5);
        aList.add(a6);
        aList.add(a7);
        aList.add(a8);
        aList.add(a9);

        Collections.shuffle(aList);

        List<A> reorder = reorder(aList, A::getId, A::getPId, (v1, v2) -> v1);
    }
}

结果:

: {"id":"0"}: [{"id":"1","pid":"0"},{"id":"2","pid":"0"},{"id":"7","pid":"0"}]: {"id":"1","pid":"0"}: [{"id":"3","pid":"1"},{"id":"4","pid":"1"},{"id":"5","pid":"1"}]: {"id":"3","pid":"1"}: null: {"id":"4","pid":"1"}: [{"id":"9","pid":"4"}]: {"id":"9","pid":"4"}: null: {"id":"5","pid":"1"}: null: {"id":"2","pid":"0"}: [{"id":"6","pid":"2"}]: {"id":"6","pid":"2"}: [{"id":"8","pid":"6"}]: {"id":"8","pid":"6"}: null: {"id":"7","pid":"0"}: null

 /**
     * 重排序(不展开)
     *
     * @param oldList       原本的List
     * @param keyMapper     排序id
     * @param parentMapper  排序父id
     * @param mergeFunction id重复的处理方法
     * @param <T>           对象
     * @param <K>           id
     * @return 排序后的list
     */
    public static <T extends AbstractReorder<T>, K> List<T> reorder(List<T> oldList,
                                                                    Function<? super T, ? extends K> keyMapper,
                                                                    Function<? super T, ? extends K> parentMapper,
                                                                    BinaryOperator<T> mergeFunction) {
        Map<K, T> tMapByk = oldList.stream().collect(Collectors.toMap(keyMapper, Function.identity(), mergeFunction));

        List<T> treeList = new ArrayList<>();

        tMapByk.values().parallelStream().forEach((t) -> {
            K parentK = parentMapper.apply(t);
            K own = keyMapper.apply(t);

            if (!own.equals(parentK)) {
                //自己的父类不能是自己
                T parentT = tMapByk.get(parentK);
                if (null == parentT) {
                    //如果父类是空的, 或者在该 Lis 中 没有知道, 那么, 就判定自己就是顶级父类
                    treeList.add(t);
                } else {
                    List<T> childList = parentT.getChildren();
                    if (null == childList) {
                        childList = new ArrayList<>();
                    }
                    childList.add(t);
                    parentT.setChildren(childList);
                }
            }
        });

        return treeList;
    }
//因为无法知道需要将child塞到哪个字段上, 所以通过继承实现的方式去给child 赋值
public interface AbstractReorder<T> {

    void setChildren(List<T> children);

    List<T> getChildren();
}


@Getter
@Setter
@ToString
public class A implements AbstractReorder<A> {
     private String id;
     private String pId;
     private List<A> child;


	@Override
    public void setChildren(List<AmisPage> children) {
        this.child = children;
    }

    @Override
    public List<AmisPage> getChildren() {
        return child;
    }
 }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值