做了一个名字排序,n久后出现bug
程序员文章站
2024-03-23 23:12:16
...
做了一个名字排序,一直没有问题,自己测试也是没有问题,最近又一次接触这个模块,同事发现工号不同,名字相同的两个人会被筛选掉一个,肯定是排序的问题,让同事去排查排序,后来想起来这个排序是我写的。。。
原本用name作为标识,现在用公司id和userid作为标识,
package com.sf.fslinker.task.api.utils;
import com.github.stuxuhai.jpinyin.PinyinFormat;
import com.github.stuxuhai.jpinyin.PinyinHelper;
import com.sf.fslinker.task.api.model.vo.TaskUserVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Slf4j
public final class Pinyin {
private Pinyin(){}
/**
* 中文转英文
* */
@SuppressWarnings("unused")
public static String getPinyin(String text) {
Pattern ptr = Pattern.compile("[\\u4e00-\\u9fa5]{1,4}");
Matcher m = ptr.matcher(text);
String tempStr = null;
if (m.find() && m.group(0).equals(text)){
try
{
tempStr = PinyinHelper.convertToPinyinString(text, "", PinyinFormat.WITHOUT_TONE);
} catch (Exception e)
{
log.info("convertToPinyinError:{}",e.getStackTrace());
}
}
return tempStr;
}
/**
* 将名字中的中文转成英文
* */
public static String transform(String name){
if(StringUtils.isBlank(name)){
return "";
}
char[] chars = name.toCharArray();
StringBuilder builder = new StringBuilder();
for (char c : chars) {
String s1 = Character.toString(c);
String s2 = getPinyin(s1);
if(s2!=null){
builder.append(s2);
}else {
builder.append(s1);
}
}
return builder.toString();
}
/**
* 根据name进行排序
*
* @param list
* @return List<TaskUserVO>
* */
public static List<TaskUserVO> orderListByName(List<TaskUserVO> list){
ArrayList<String> nameList = new ArrayList<>();
HashMap<String, TaskUserVO> objectMap = new HashMap<>();
HashMap<String, String> nameMap = new HashMap<>();
String f="A";
int i=1;
if(CollectionUtils.isNotEmpty(list)){
ArrayList<TaskUserVO> resultList = new ArrayList<>();
for (TaskUserVO taskUserVO : list) {
String userKey = taskUserVO.getCompanyId()+"_"+taskUserVO.getUserId();
String name = taskUserVO.getUserName();
objectMap.put(userKey,taskUserVO);
String pinying = transform(name);
// 添加判断是否存在相同的拼音
String flag = nameMap.get(pinying);
if(flag!=null){
pinying+=Integer.toString(i);
i++;
}
nameMap.put(pinying,userKey);
nameList.add(pinying);
}
Collections.sort(nameList);
for (String py : nameList) {
String userKey = nameMap.get(py);
TaskUserVO taskUser = objectMap.get(userKey);
resultList.add(taskUser);
}
return resultList;
}else {
return null;
}
}
}
下一篇: Java——匿名内部类实现线程的两种方式
推荐阅读