List列表转成树,并且根据名称排序
warning:
这篇文章距离上次修改已过277天,其中的内容可能已经有所变动。
List列表转成树前提是数据有panrentid能找到上级,并且根据名称排序
public static List<ResidentialQuarters> buildTree(List<ResidentialQuarters> residentialQuarters) {
// 首先找到所有的顶级节点
List<ResidentialQuarters> topLevel = residentialQuarters.stream()
.filter(menu -> StringUtils.isBlank(menu.getParentId()))
.collect(Collectors.toList());
// 为每个顶级节点递归地填充子节点
topLevel.forEach(topLevelMenu -> fillChildren(topLevelMenu, residentialQuarters));
return topLevel;
}
private static void fillChildren(ResidentialQuarters parent, List<ResidentialQuarters> residentialQuarters) {
List<ResidentialQuarters> children = residentialQuarters.stream()
.filter(menu -> menu.getParentId() != null && menu.getParentId().equals(parent.getId()))
.collect(Collectors.toList());
// 递归填充子节点之前对子节点进行排序
children.forEach(child -> fillChildren(child, residentialQuarters));
Comparator<ResidentialQuarters> mixedComparator = (menu1, menu2) -> {
String name1 = menu1.getQuartersName();
String name2 = menu2.getQuartersName();
// 检查两个name是否都是纯数字
boolean isNumeric1 = name1.matches("\\d+");
boolean isNumeric2 = name2.matches("\\d+");
// 如果两个name都是纯数字,按照数值大小比较
if (isNumeric1 && isNumeric2) {
return Integer.compare(Integer.parseInt(name1), Integer.parseInt(name2));
}
// 如果其中一个不是纯数字,按照字符串字典顺序比较
return name1.compareTo(name2);
};
// 使用自定义的比较器进行排序
children.sort(mixedComparator);
//children.sort(Comparator.comparingInt(menu -> Integer.parseInt(menu.getQuartersName())));
// 将排序后的子节点添加到父节点的子列表中
children.forEach(parent::addChild);
}