排序:按照实体类中的名称排序,数字开头、英文开头、汉字开头分别在一起,然后按照数字大小或者首字母、拼音首字母排序

返回实体类:

@Getter
@Setter
@ApiModel("组织机构树")
public class OrganizationDto implements Serializable {

    @ApiModelProperty("机构id")
    private Long id;

    @ApiModelProperty("机构名称")
    private String name;

    @ApiModelProperty("父节点")
    private Long parentId;

    @ApiModelProperty("备注")
    private String comment;

    @ApiModelProperty("子机构")
    private List<OrganizationDto> children = new ArrayList<>();



    public List<OrganizationDto> getChildren() {
        if (!ObjectUtils.isEmpty(children)) {
            Collections.sort(children, new PinyinComparator());
        }
        return children;
    }

    public void setChildren(List<OrganizationDto> children) {
        this.children = children;
    }

}

排序规则工具类:

public class PinyinComparator implements Comparator<OrganizationDto> {

    /**
     * 比较首字母
     *
     * @param organizationDto
     * @param otherOrganizationDto
     * @return
     */
    public int compare(OrganizationDto organization, OrganizationDto otherOrganization) {
        int initials = organizationDto.getName().charAt(0);
        int otherInitials = otherOrganizationDto.getName().charAt(0);
        String pinyin1 = convertPinyin((char) initials);
        String pinyin2 = convertPinyin((char) otherInitials);
        // 两个字符都是汉字
        if (pinyin1 != null && pinyin2 != null) {
            if (!pinyin1.equals(pinyin2)) {
                return pinyin1.compareTo(pinyin2);
            } else {
                return 0;
            }
        } else {
            return organizationDto.getName().substring(0, 1).toLowerCase().charAt(0) - otherOrganizationDto.getName().substring(0, 1).toLowerCase().charAt(0);
        }
    }

    /**
     * 字符的拼音,多音字就得到第一个拼音。不是汉字,就return null。
     *        
     */
    private String convertPinyin(char chinese) {
        String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(chinese);
        if (pinyins == null) {
            return null;
        }
        return pinyins[0];
    }
}

查询机构树,并组装:

/**
     * 查询组织机构树
     *
     * @param currentTenantId
     * @return
     */
    @Override
    public Organization getOrganizationTree() {
        //查询所有机构
        Map<Long, OrganizationDto> organizationMap = organizationRepository.findAll().stream()
                .collect(Collectors
                        .toMap(Organization::getId,
                                organization -> {
                                    Organization organization = new Organization();
                                    BeanUtils.copyProperties(organization, organization);
                                    return organizationDto;
                                }));
        //组装组织机构树,
        organizationMap.forEach((key, organization) -> {
            if (Objects.nonNull(organizationMap.get(organization.getParentId())) && !ACCOUNT_CATEGORY_TAG_ID.equals(key)) {
                organizationMap.get(organization.getParentId()).getChildren().add(organization);
            }

        });

        return organizationMap.get("根节点的id");
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值