Java 将无序的省市列表,按照汉字首字母排序

场景:

1)我现在有一组无序的省市列表,格式如下:

 

2)需要转成按照首字母顺序排列的省市列表,省市都需要排序,而且省要按照首字母分组,如下样式:

3)json格式如下:

注意:首字母为A的省有多个,所有provinceList 为集合。

 

 

代码

1)添加拼音的依赖包

<dependency>
  <groupId>com.belerweb</groupId>
  <artifactId>pinyin4j</artifactId>
  <version>2.5.0</version>
</dependency>

 

2)省/市类 ListSearchTermDetailVo 

public class ListSearchTermDetailVo {

    private String code;

    private String nameCh;

    private List<ListSearchTermDetailVo> childNodes;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getNameCh() {
        return nameCh;
    }

    public void setNameCh(String nameCh) {
        this.nameCh = nameCh;
    }

    public List<ListSearchTermDetailVo> getChildNodes() {
        return childNodes;
    }

    public void setChildNodes(List<ListSearchTermDetailVo> childNodes) {
        this.childNodes = childNodes;
    }
}

 

3)排序后的省市类  WorkPlaceVo 

public class WorkPlaceVo {

    // 省首字母
    private String firstLetter;

    // 省列表
    private List<ListSearchTermDetailVo> provinceList;

    public String getFirstLetter() {
        return firstLetter;
    }

    public void setFirstLetter(String firstLetter) {
        this.firstLetter = firstLetter;
    }

    public List<ListSearchTermDetailVo> getProvinceList() {
        return provinceList;
    }

    public void setProvinceList(List<ListSearchTermDetailVo> provinceList) {
        this.provinceList = provinceList;
    }
}

 

4)排序代码

                
                // 排序前的省市列表,假设此处已经有数据
                List<ListSearchTermDetailVo> provinceList = xxx;

                // 排序后的省市列表
                List<WorkPlaceVo> workPlaceVoList = new ArrayList<>();
                // 获取中文环境
                Comparator comparator = Collator.getInstance(Locale.CHINA);
                // 排序实现
                // 对省进行排序
                Collections.sort(provinceList, (e1, e2) -> {
                    return comparator.compare(e1.getNameCh(), e2.getNameCh());
                });
                // 对市进行排序
                for (ListSearchTermDetailVo vo:provinceList){
                    List<ListSearchTermDetailVo> childNodes = vo.getChildNodes();
                    if(CollectionUtils.isNotEmpty(childNodes)){
                        Collections.sort(childNodes, (e1, e2) -> {
                            return comparator.compare(e1.getNameCh(), e2.getNameCh());
                        });
                    }

                    // 获取省的中文首字母
                    String nameCh = vo.getNameCh();
                    String firstLetter = Pinyin4jUtil.getFirstLetter(nameCh);

                    // 判断 工作地点列表中是否已包含 此首字母的省份
                    List<WorkPlaceVo> collect = workPlaceVoList.stream().filter(s -> firstLetter.equals(s.getFirstLetter())).collect(Collectors.toList());
                    if(CollectionUtils.isNotEmpty(collect)){
                        collect.get(0).getProvinceList().add(vo);

                    }else {
                        WorkPlaceVo workPlaceVo = new WorkPlaceVo();
                        ArrayList<ListSearchTermDetailVo> vos = new ArrayList<>();
                        vos.add(vo);
                        workPlaceVo.setFirstLetter(firstLetter);
                        workPlaceVo.setProvinceList(vos);
                        workPlaceVoList.add(workPlaceVo);
                    }
                }

 

Pinyin4jUtil:

import net.sourceforge.pinyin4j.PinyinHelper;

public class Pinyin4jUtil {


    /**
     * 得到汉字字符串中文首字母
     * 比如:北京 -> B
     *
     * @param str
     * @return
     */
    public static String getFirstLetter(String str) {
        if(StringUtils.isBlank(str)){
            return null;
        }

        String convert = "";
        char word = str.charAt(0);
        String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
        if (pinyinArray != null) {
            convert += pinyinArray[0].charAt(0);
        } else {
            convert += word;
        }
        return convert.toUpperCase();
    }

}

 


版权声明:本文为xuruanshun原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。