场景:
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版权协议,转载请附上原文出处链接和本声明。