如下:1、10 为一级类别(职称/行业),2、5、8、11 为二级类别,3、4、6、7、9、12 为三级类别
需要的结果为:3,4,6,7,9,2,5,8,12, 11, 10
package com.zjtx.model.vo;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 系统分类
* 2020/4/27 0027 下午 15:47
*/
public class SysTypeVO {
private Integer typeId;
private Integer id;
private Integer pid;
private Integer lev;
private String name;
private List<SysTypeVO> child;
public Integer getTypeId() {
return typeId;
}
public SysTypeVO setTypeId(Integer typeId) {
this.typeId = typeId;
return this;
}
public Integer getId() {
return id;
}
public SysTypeVO setId(Integer id) {
this.id = id;
return this;
}
public Integer getPid() {
return pid;
}
public SysTypeVO setPid(Integer pid) {
this.pid = pid;
return this;
}
public Integer getLev() {
return lev;
}
public SysTypeVO setLev(Integer lev) {
this.lev = lev;
return this;
}
public String getName() {
return name;
}
public SysTypeVO setName(String name) {
this.name = name;
return this;
}
public List<SysTypeVO> getChild() {
return child;
}
public SysTypeVO setChild(List<SysTypeVO> child) {
this.child = child;
return this;
}
/**
* 按不同层级得到集合
* @param levMap
* @param node
*/
public static void getChildren(Map<String, List<Integer>> levMap, SysTypeVO node) {
if (!CollectionUtils.isEmpty(node.getChild())) {
levMap.put(node.getLev() + "." + node.getId(), node.getChild().stream().map(SysTypeVO::getTypeId).collect(Collectors.toList()));
for (SysTypeVO node1 : node.getChild()) {
getChildren(levMap, node1);
}
}
}
/**
* 获取排序 3、2、1
* @param sysTypeVOS
* @return
*/
public static List<Integer> getSortTypeIds(List<SysTypeVO> sysTypeVOS){
List<Integer> toIds = new ArrayList<>();
if(CollectionUtils.isEmpty(sysTypeVOS))
return toIds;
List<SysTypeVO> nodeList = new ArrayList<>();
for (SysTypeVO node1 : sysTypeVOS) {
boolean mark = false;
for (SysTypeVO node2 : sysTypeVOS) {
if (node1.getPid() != null && node1.getPid().equals(node2.getTypeId())) {
mark = true;
if (node2.getChild() == null)
node2.setChild(new ArrayList<SysTypeVO>());
node2.getChild().add(node1);
break;
}
}
if (!mark) {
nodeList.add(node1);
}
}
List<SysTypeVO> lev1NodeList = nodeList.stream().filter(o->{
return o.getLev().equals(1);
}).collect(Collectors.toList());
//类别有误 -- 没有找到1级
if(CollectionUtils.isEmpty(lev1NodeList)){
return toIds;
}
Map<String, List<Integer>> levMap = new HashMap<>();
for (SysTypeVO sysTypeVO : lev1NodeList) {
levMap.clear();
getChildren(levMap, sysTypeVO);
if(CollectionUtils.isEmpty(levMap)){
continue;
}
//--------------------
// 从 1.1 2.2 2.5 变成 2.2 2.5 1.1 顺序
List<String> sortKeys = new ArrayList<>();
List<String> keys = new ArrayList<>(levMap.keySet());
String lev1Key = "";
for (String key : keys) {
if (key.startsWith("1.")) {
lev1Key = key;
continue;
}
sortKeys.add(key);
}
sortKeys.add(lev1Key);
//----------------------------------
for (String lev1 : sortKeys) {
List<Integer> ids = levMap.get(lev1);
toIds.addAll(ids);
}
toIds.add(sysTypeVO.getTypeId()); // 1 级 id
levMap.clear();
}
return toIds;
}
public static void main(String[] args) {
List<SysTypeVO> sysTypeVOS = new ArrayList<>();
sysTypeVOS.add(new SysTypeVO().setId(1).setTypeId(1).setLev(1).setPid(0));
sysTypeVOS.add(new SysTypeVO().setId(2).setTypeId(2).setLev(2).setPid(1));
sysTypeVOS.add(new SysTypeVO().setId(3).setTypeId(3).setLev(3).setPid(2));
sysTypeVOS.add(new SysTypeVO().setId(4).setTypeId(4).setLev(3).setPid(2));
sysTypeVOS.add(new SysTypeVO().setId(5).setTypeId(5).setLev(2).setPid(1));
sysTypeVOS.add(new SysTypeVO().setId(6).setTypeId(6).setLev(3).setPid(5));
sysTypeVOS.add(new SysTypeVO().setId(7).setTypeId(7).setLev(1).setPid(0));
sysTypeVOS.add(new SysTypeVO().setId(8).setTypeId(8).setLev(2).setPid(7));
sysTypeVOS.add(new SysTypeVO().setId(9).setTypeId(9).setLev(3).setPid(8));
List<Integer> toIds = getSortTypeIds(sysTypeVOS);
//levMap.put("0", lev1Ids);
System.out.println(toIds); //[6, 4, 3, 5, 2, 1, 9, 8, 7]
sysTypeVOS.clear();
sysTypeVOS.add(new SysTypeVO().setId(211960).setTypeId(312).setLev(1).setPid(0));
sysTypeVOS.add(new SysTypeVO().setId(211961).setTypeId(373).setLev(2).setPid(312));
sysTypeVOS.add(new SysTypeVO().setId(211962).setTypeId(390).setLev(3).setPid(373));
toIds = getSortTypeIds(sysTypeVOS);
//levMap.put("0", lev1Ids);
System.out.println(toIds); //[6, 4, 3, 5, 2, 1, 9, 8, 7]
}
}