版权声明:没有申明版权,你们随意! https://blog.csdn.net/baby986911/article/details/80050052
1、定义一个对象(对象哦)
/** * 创建人: xuyanyun * 联系方式: * 创建时间: 2018/4/23 13:48 * 页面名称: */ public class User implements Serializable { private String NAME;//姓名 private String CODE;//人员编码 private String PERSON_TYPE;//人员分类 private String letter;//姓名首字母 private String SEX;//性别 public User(String NAME) { this.NAME = NAME; setLetter(); } public String getNAME() { return NAME; } public void setNAME(String NAME) { this.NAME = NAME; //在设置姓名时,直接把首字符给塞进去 setLetter(); } public String getCODE() { return CODE; } public void setCODE(String CODE) { this.CODE = CODE; } public String getPERSON_TYPE() { return PERSON_TYPE; } public void setPERSON_TYPE(String PERSON_TYPE) { this.PERSON_TYPE = PERSON_TYPE; } public String getLetter() { return letter; } public void setLetter() { //这里根据姓名的首字符来塞 String nameString = getNAME(); //这里要判断第一个是不是中文 if (null == nameString) this.letter = "#"; String indexStr = nameString.substring(0, 1); try { Integer.valueOf(indexStr); this.letter = "#"; return; } catch (Exception ex) {
//这里只取了首字符,得到全部,就别去substring();
this.letter = PingYinUtil.INS.getPYIndexStr(indexStr, true);} } public String getSEX() { return SEX; } public void setSEX(String SEX) { this. SEX = SEX; } @Override public String toString() { return "User{" + "NAME='" + NAME + ' \' ' + ", letter='" + letter + ' \' ' + '}'; }}
2、定义一个工具类
/** * 创建人: xuyanyun * 联系方式: * 创建时间: 2018/4/23 13:53 * 页面名称: */ public enum PingYinUtil { INS; /** * -----------------这个是通过百度查找到的,具体链接记不得了(对不住原创者). * * @param strChinese * @param bUpCase * @return */ public String getPYIndexStr(String strChinese, boolean bUpCase) { try { StringBuffer buffer = new StringBuffer(); byte b[] = strChinese.getBytes("GBK");//把中文转化成byte数组 for (int i = 0; i < b.length; i++) { if ((b[i] & 255) > 128) { int char1 = b[i++] & 255; char1 <<= 8;//左移运算符用“<<”表示,是将运算符左边的对象,向左移动运算符右边指定的位数,并且在低位补零。其实,向左移n位,就相当于乘上2的n次方 int chart = char1 + (b[i] & 255); buffer.append(getPYIndexChar((char) chart, bUpCase)); continue; } char c = (char) b[i]; if (!Character.isJavaIdentifierPart(c))//确定指定字符是否可以是 Java 标识符中首字符以外的部分。 c = 'A'; buffer.append(c); } return buffer.toString(); } catch (Exception e) { System.out.println((new StringBuilder()).append("\u53D6\u4E2D\u6587\u62FC\u97F3\u6709\u9519").append(e.getMessage()).toString()); } return null; } /** * 得到首字母 * * -----------------这个是通过百度查找到的,具体链接记不得了(对不住原创者). * * @param strChinese * @param bUpCase * @return */ private char getPYIndexChar(char strChinese, boolean bUpCase) { int charGBK = strChinese; char result; if (charGBK >= 45217 && charGBK <= 45252) result = 'A'; else if (charGBK >= 45253 && charGBK <= 45760) result = 'B'; else if (charGBK >= 45761 && charGBK <= 46317) result = 'C'; else if (charGBK >= 46318 && charGBK <= 46825) result = 'D'; else if (charGBK >= 46826 && charGBK <= 47009) result = 'E'; else if (charGBK >= 47010 && charGBK <= 47296) result = 'F'; else if (charGBK >= 47297 && charGBK <= 47613) result = 'G'; else if (charGBK >= 47614 && charGBK <= 48118) result = 'H'; else if (charGBK >= 48119 && charGBK <= 49061) result = 'J'; else if (charGBK >= 49062 && charGBK <= 49323) result = 'K'; else if (charGBK >= 49324 && charGBK <= 49895) result = 'L'; else if (charGBK >= 49896 && charGBK <= 50370) result = 'M'; else if (charGBK >= 50371 && charGBK <= 50613) result = 'N'; else if (charGBK >= 50614 && charGBK <= 50621) result = 'O'; else if (charGBK >= 50622 && charGBK <= 50905) result = 'P'; else if (charGBK >= 50906 && charGBK <= 51386) result = 'Q'; else if (charGBK >= 51387 && charGBK <= 51445) result = 'R'; else if (charGBK >= 51446 && charGBK <= 52217) result = 'S'; else if (charGBK >= 52218 && charGBK <= 52697) result = 'T'; else if (charGBK >= 52698 && charGBK <= 52979) result = 'W'; else if (charGBK >= 52980 && charGBK <= 53688) result = 'X'; else if (charGBK >= 53689 && charGBK <= 54480) result = 'Y'; else if (charGBK >= 54481 && charGBK <= 55289) result = 'Z'; else result = (char) (65 + (new Random()).nextInt(25)); if (!bUpCase) result = Character.toLowerCase(result); return result; } /** * 传对象的集合,就能得到排序后的 * @param uList * @return */ public List<User> sortUserList(List<User> uList ){ if(uList==null || uList.size()==0){ return null; } Map<String, User> map = new HashMap<>(); int uSize = uList.size(); String names[] = new String[uSize]; for(int i=0;i<uSize;i++){ String name = uList.get(i).getNAME(); names[i] = name; map.put(name, uList.get(i)); } names = sort(names); uList.clear(); for(String name : names){ if(map.containsKey(name)) uList.add(map.get(name)); } return uList; } public String[] sort(String [] nameData){ if(nameData==null || nameData.length==0){ return null; } Comparator<Object> comparator = Collator.getInstance(java.util.Locale.CHINA); Arrays.sort(nameData, comparator); return nameData; } }
3、测试
User user = new User("肖X丹"); User user1 = new User("小X丹"); User user2 = new User("大X丹"); User user3 = new User("达X丹"); User user4 = new User("好X丹"); User user5 = new User("坏X丹"); User user6 = new User("成X风"); User user7 = new User("史X"); User user8 = new User("X晶"); User user9 = new User("傻逼"); User user12 = new User("1234"); List<User> uList = new ArrayList<>(); uList.add(user); uList.add(user1); uList.add(user2); uList.add(user3); uList.add(user4); uList.add(user5); uList.add(user6); uList.add(user7); uList.add(user8); uList.add(user9); uList.add(user12); for (User user10 : uList){ System.out.println("前--->"+user10.toString()); } uList = PingYinUtil.INS.sortUserList(uList); for (User user11 : uList){ System.out.println("后--->"+user11.toString()); }