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

场景:

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

Java 将无序的省市列表,按照汉字首字母排序_第1张图片

 

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

Java 将无序的省市列表,按照汉字首字母排序_第2张图片

3)json格式如下:

Java 将无序的省市列表,按照汉字首字母排序_第3张图片

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

 

 

代码

1)添加拼音的依赖包


  com.belerweb
  pinyin4j
  2.5.0

 

2)省/市类 ListSearchTermDetailVo 

public class ListSearchTermDetailVo {

    private String code;

    private String nameCh;

    private List 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 getChildNodes() {
        return childNodes;
    }

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

 

3)排序后的省市类  WorkPlaceVo 

public class WorkPlaceVo {

    // 省首字母
    private String firstLetter;

    // 省列表
    private List provinceList;

    public String getFirstLetter() {
        return firstLetter;
    }

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

    public List getProvinceList() {
        return provinceList;
    }

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

 

4)排序代码

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

                // 排序后的省市列表
                List 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 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 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 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();
    }

}

 

你可能感兴趣的:(基础知识)