接到一个需求,需要根据用户得名字把其分组一下,效果图如下
我是后端,这我得写接口啊,搞得我头皮发麻,所以记录一下
返回的数据结构是这样的
操作步骤,
- 首先引入一个拼音包
<!--拼音包-->
<!-- https://mvnrepository.com/artifact/com.belerweb/pinyin4j -->
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.0</version>
</dependency>
- 定义一个前端规定得数据结构
@Data
public class SysPrivateClassVo {
/**
* 主键
*/
private String type;
private List<SysPrivateClass> letter;
}
- 编写业务代码
@Autowired
private SysPrivateClassMapper sysPrivateClassMapper;
/**
* 根据上课教练ID和传过来的时间(yyyy-MM-dd)
* 查询教练今天的课程以及今天的上课的学员
*
* @param sysPrivateClass
* @return
*/
@Override
public List<SysPrivateClassVo> getPrivateClasses(SysPrivateClass sysPrivateClass) {
List<SysPrivateClass> privateClasses = sysPrivateClassMapper.getPrivateClasses(sysPrivateClass);
List<SysPrivateClassVo> map = screenManufacturer(privateClasses);
return map;
}
/**
* 获取汉字串拼音,英文字符不变
*/
public static String getFullSpell(String chinese) {
StringBuffer pybf = new StringBuffer();
char[] arr = chinese.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (int i = 0; i < arr.length; i++) {
if (arr[i] > 128) {
try {
pybf.append(PinyinHelper.toHanyuPinyinStringArray(arr[i], defaultFormat)[0]);
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
pybf.append(arr[i]);
}
}
return pybf.toString();
}
/**
* 将集合数据按照汉字首字母分组排序
*/
public static List<SysPrivateClassVo> screenManufacturer(List<SysPrivateClass> list) {
try {
Collator com = Collator.getInstance(java.util.Locale.CHINA);
// 按字母排序
// 1 通过java 8 stream流进行处理
Collection<String> strings = list.stream().map(SysPrivateClass::getCustomerName).sorted(Collator.getInstance(Locale.CHINA)).collect(Collectors.toList());
//Collections.sort(list, com);
// 输出26个字母
List<SysPrivateClassVo> classVos = Collections.synchronizedList(new ArrayList<>());
Map<String, Object> map = new TreeMap<>();
for (int i = 0; i < 27; i++) {
String word = String.valueOf((char)(96 + i)).toUpperCase();
// 循环找出 首字母一样的数据
List<SysPrivateClass> letter = Collections.synchronizedList(new ArrayList<>());
Iterator<SysPrivateClass> ite = list.iterator();
int count=0;
while(ite.hasNext()){
SysPrivateClass str = ite.next();
String pybf = getFullSpell(str.getCustomerName());
String zm = pybf.substring(0, 1);
String pattern = "[A-Z]*";
boolean isMatch = Pattern.matches(pattern, zm);
if(!isMatch){
letter.add(str);
ite.remove();
SysPrivateClassVo classVo = new SysPrivateClassVo();
classVo.setLetter(letter);
classVo.setType("#");
classVos.add(classVo);
count=1;
}
if (word.equals(zm)) {
letter.add(str);
count=0;
}
}
if(count==0){
SysPrivateClassVo classVo = new SysPrivateClassVo();
classVo.setLetter(letter);
classVo.setType(word);
classVos.add(classVo);
}
}
return classVos;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
如果发现博客有问题,欢迎各位老鸟指点一二