经验-做了一个名字排序,n久后出现bug

做了一个名字排序,一直没有问题,自己测试也是没有问题,最近又一次接触这个模块,同事发现工号不同,名字相同的两个人会被筛选掉一个,肯定是排序的问题,让同事去排查排序,后来想起来这个排序是我写的。。。

原本用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;
		}
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值