欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

做了一个名字排序,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;
		}
	}

}

相关标签: 特殊需求