一个正在努力的菜鸡程序员 2021-08-17 22:48 采纳率: 0%
浏览 80
已结题

循环去重拼接成树形结构,栈溢出问题。


 public List<TreeList> select() {
        //oneTree为返回值,里面存放的是只有一级数据,一级为subarea
        List<TreeList> dList = testService.list(new LambdaQueryWrapper<TreeList>());
        List<TreeList> oneTree = dList.stream().filter(distinctByKey1(item -> item.getSubarea())).collect(Collectors.toList());
        oneTree.forEach(one -> {
            one.setLabel(one.getSubarea());
            //对应一级的二级。(应为有三级数据,所以二级数据会重名)
            List<TreeList> twoTree  = dList.stream().filter(item -> item.getSubarea().equals(one.getSubarea())).collect(Collectors.toList());
            //去重
            twoTree = twoTree.stream().filter(distinctByKey1(item -> item.getStname())).collect(Collectors.toList());
            if (!twoTree.isEmpty()) {
                twoTree.forEach(two -> {
                    two.setLabel(two.getStname());
                    ArrayList<TreeList> treeLists = new ArrayList<>();
                    TreeList treeList = new TreeList();
                    treeList.setLabel("三级自定义名称");
                    //四级数据,四级的二级名称,对应二级的二级名称。
                    List<TreeList> fourTree = dList.stream().filter(item -> item.getStname().equals(two.getStname())).collect(Collectors.toList());
                    fourTree.forEach(item->item.setLabel(item.getDvname()));
                    treeList.setChildren(fourTree);
                    treeLists.add(treeList);
                    two.setChildren(treeLists);
                });
            }
            one.setChildren(twoTree);
        });
        System.out.println(oneTree);
        return oneTree;
    }


 static <T> Predicate<T> distinctByKey1(Function<? super T, ?> keyExtractor) {
        Map<Object, Boolean> seen = new ConcurrentHashMap<>();
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }



@Data
@TableName("test")
public class TreeList {

    @TableField(value = "subarea")
    private String subarea;//区域1级

    @TableField(value = "stname")
    private String stname;//首端厂站名2级

    @TableField(value = "dvname")
    private String dvname;//设备名称3级
    @TableField(exist = false)
    private String name;//三级自定义名称
    @TableField(exist = false)
    private String label;
    @TableField(exist = false)
    private List<TreeList> children = new ArrayList<>();//子节点


    @Override
    public String toString() {
        return "TreeList{" +
                "subarea='" + subarea + '\'' +
                ", stname='" + stname + '\'' +
                ", dvname='" + dvname + '\'' +
                ", name='" + name + '\'' +
                ", label='" + label + '\'' +
                ", children=" + children +
                '}';
    }
}

  • 写回答

2条回答 默认 最新

  • qq_34370249 2021-08-18 09:31
    关注

    输出的时候,应该是遍历而不是单纯的输出

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月18日
  • 创建了问题 8月17日

悬赏问题

  • ¥15 c#调用yolo3 dll文件获取的数据对不上
  • ¥20 WPF 如何实现多语言,label 和cs(live Charts)中是否都能翻译
  • ¥15 STM32F103上电短路问题
  • ¥15 关于#单片机#的问题:以ATMEGA128或相近型号单片机为控制器设计直流电机调速的闭环控制系统(相关搜索:设计报告|软件设计|流程图)
  • ¥15 打开软件提示错误:failed to get wglChoosePixelFormatARB
  • ¥15 (标签-python|关键词-char)
  • ¥15 python+selenium,在新增时弹出了一个输入框
  • ¥15 苹果验机结果的api接口哪里有??单次调用1毛钱及以下。
  • ¥20 学生成绩管理系统设计
  • ¥15 来一个cc穿盾脚本开发者