list转tree结构时如何加上排序?

Entity

@Data
public class MenuNode {
    private Integer id;
    private String name;
    private String menuCode;
    private String parentCode;
    private String path;
    private Integer sort;
    private List<MenuNode> children;
}

Controller

@RequestMapping("/trees")
public List<MenuNode> trees() {
    // return  service.trees();
    return listToTree(service.trees());
}


// list转tree结构
private List<MenuNode> listToTree(List<MenuNode> list) {
    List<MenuNode> tree = new ArrayList<>();
    for (MenuNode menu : list) {
        //找到根节点
        if (menu.getParentCode().length() == 0) {
            tree.add(menu);
        }

        //再次遍历list,找到子节点
        List<MenuNode> children = new ArrayList<>();
        for (MenuNode node : list) {
            if (node.getParentCode().equals(menu.getMenuCode())) {
                children.add(node);
            }
        }
        menu.setChildren(children);
    }

    return tree;
}
idmenu_codeparent_codenamepathsort
1ME00001 菜单1/a3
2ME00002 菜单2/b2
3ME00003 菜单3/c1
4ME00004ME00001菜单11/a/i4
5ME00005ME00001菜单12/a/j0
6ME00006ME00004菜单111/a/i/x0
7ME00007ME00004菜单112/a/i/y0

结果没排序

sort数据库默认值0,排序不同层级的要设置成唯一吗?
再写一个方法,递归遍历数组排序?

[
  {
    "id": 1,
    "name": "菜单1",
    "menuCode": "ME00001",
    "parentCode": "",
    "path": "/a",
    "sort": 1,
    "children": [
      {
        "id": 4,
        "name": "菜单11",
        "menuCode": "ME00004",
        "parentCode": "ME00001",
        "path": "/a/i",
        "sort": 4,
        "children": [
          {
            "id": 6,
            "name": "菜单111",
            "menuCode": "ME00006",
            "parentCode": "ME00004",
            "path": "/a/i/x",
            "sort": 0,
            "children": []
          },
          {
            "id": 7,
            "name": "菜单112",
            "menuCode": "ME00007",
            "parentCode": "ME00004",
            "path": "/a/i/y",
            "sort": 0,
            "children": []
          }
        ]
      },
      {
        "id": 5,
        "name": "菜单12",
        "menuCode": "ME00005",
        "parentCode": "ME00001",
        "path": "/a/j",
        "sort": 0,
        "children": []
      }
    ]
  },
  {
    "id": 2,
    "name": "菜单2",
    "menuCode": "ME00002",
    "parentCode": "",
    "path": "/b",
    "sort": 2,
    "children": []
  },
  {
    "id": 3,
    "name": "菜单3",
    "menuCode": "ME00003",
    "parentCode": "",
    "path": "/c",
    "sort": 3,
    "children": []
  }
]
阅读 2.3k
2 个回答
新手上路,请多包涵

楼主可以用list的stream流来进行转换
例如:

//查询数据库所有的数据
List<AllSpaceVo> spaceInfoAllVos = mapperFacade.mapAsList(list, AllSpaceVo.class);

        //查询出一级空间
        List<AllSpaceVo> collect = spaceInfoAllVos.stream()
                .filter(info -> {
                    if (id == null) {
                        return info.getSpaceParentId().equals(0L);
                    } else {
                        return info.getSpaceParentId().equals(id);
                    }
                })
                .map(menu -> {
                    menu.setChildSpaces(getChild(menu, spaceInfoAllVos));
                    return menu;
                })
                .sorted(Comparator.comparing(AllSpaceVo::getDefOrder)
                        .thenComparing(AllSpaceVo::getCreateTime, Comparator.reverseOrder()))
                .collect(Collectors.toList());
 private List<AllSpaceVo> getChild(AllSpaceVo root, List<AllSpaceVo> all) {
        return all.stream()
                .filter((allSpaceVo -> root.getId().equals(allSpaceVo.getSpaceParentId())))
                .map(menu -> {
                    menu.setChildSpaces(getChild(menu, all));
                    return menu;
                })
                .sorted(Comparator.comparing(AllSpaceVo::getDefOrder)
                        .thenComparing(AllSpaceVo::getCreateTime, Comparator.reverseOrder()))
                .collect(Collectors.toList());
    }

用sorted进行排序

是要根据 sort 排序?看 json 结果这不是有序的?你期望的返回结果是什么?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题