特殊字符、数字开头,及中英文字符排序(类似通讯录)
来源:互联网 发布:阿里云网站搭建流程 编辑:程序博客网 时间:2024/06/08 03:34
近期做项目需要实现组织用户下的个人用户按其名称排序,因此写了个按字符排序的工具类供大家参考
这里按照字符串第一个字符,使用java原生排序的方式,即特殊字符-->数字-->英文-->中文,为了能够将英文字符串和中文字符串的首字母排列在一起,先将汉字的首字母提取出来加到该中文字符之前进行排序,完成排序后再将该字母去掉。(这里需要用到pinyin4j-2.5.0.jar)
首先,根据传入的字符串数组返回一个完成排序的列表
public static List<String> chineseAndEnglishSort(String[] arrays){ List<String> list = new ArrayList<>(); for (int i = 0; i < arrays.length; i++) { String str = arrays[i]; String alphabet = str.substring(0, 1); /*判断首字符是否为中文,如果是中文便将首字符拼音的首字母和&符号加在字符串前面*/ if (alphabet.matches("[\\u4e00-\\u9fa5]+")) { str = getAlphabet(str) + "&" + str; arrays[i] = str; } } /*设置排序语言环境*/ Comparator<Object> com = Collator.getInstance(java.util.Locale.CHINA); Arrays.sort(arrays, com); /*遍历数组,去除标识符&及首字母*/ for (int i=0;i<arrays.length;i++) { String str=arrays[i]; if(str.contains("&")&&str.indexOf("&")==1){ arrays[i]=str.split("&")[1]; } list.add(arrays[i]); } return list; }public static String getAlphabet(String str) { HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat(); // 输出拼音全部小写 defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); // 不带声调 defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); String pinyin = null; try { pinyin = (String) PinyinHelper.toHanyuPinyinStringArray(str.charAt(0), defaultFormat)[0]; } catch (BadHanyuPinyinOutputFormatCombination e) { e.printStackTrace(); } return pinyin.substring(0, 1); }进一步,为了能够将特殊字符、字母开头的字符串和中英文字符串按照二十六个字母区别开来,这里采用返回长度为28的列表方式,将分类排序好的字符串列表返回
public static List<List<String>> chineseAndEnglishSortByChar(String[] arrays){ List<String> specCharList = new ArrayList<>(); List<String> digitList = new ArrayList<>(); List<List<String>> listGroup = new ArrayList<List<String>>(); for (int i = 0; i < arrays.length; i++) { String str = arrays[i]; String alphabet = str.substring(0, 1); /*判断首字符是否为中文,如果是中文便将首字符拼音的首字母和&符号加在字符串前面*/ if (alphabet.matches("[\\u4e00-\\u9fa5]+")) { str = getAlphabet(str) + "&" + str; arrays[i] = str; } } /*设置排序语言环境*/ Comparator<Object> com = Collator.getInstance(java.util.Locale.CHINA); Arrays.sort(arrays, com); for(int i = 0;i<arrays.length;i++){ System.out.println(arrays[i]); } System.out.println(); /*遍历数组,去除标识符&及首字母*/ if(arrays[0].substring(0, 1).matches("[0-9]?")){ listGroup.add(specCharList); }else{ if((arrays[0].substring(0, 1).matches("^[a-zA-Z]*"))){ listGroup.add(specCharList); listGroup.add(digitList); } } for (int i=0;i<arrays.length;) { if((arrays[i].substring(0, 1).matches("[0-9]?"))){ while((i<arrays.length)&&(arrays[i].substring(0, 1).matches("[0-9]?"))){ digitList.add(arrays[i]); i++; } listGroup.add(digitList); }else if((arrays[i].substring(0, 1).matches("^[a-zA-Z]*"))){ for(char ch = 'a';ch <= 'z';ch++){ List<String> list = new ArrayList<>(); while((i<arrays.length)&&((arrays[i].charAt(0) == ch) || (arrays[i].charAt(0) == (char)(ch-32)))){ String str=arrays[i]; if(str.contains("&")&&str.indexOf("&")==1){ arrays[i]=str.split("&")[1]; } list.add(arrays[i]); i++; } listGroup.add(list); } }else{ specCharList.add(arrays[i]); i++; if((i>=arrays.length)||((i<arrays.length)&&(arrays[i].substring(0, 1).matches("[0-9]?")))){ listGroup.add(specCharList); } } } return listGroup; }
测试代码
public static void main(String[] args) { String[] arrays = new String[] { "吴彦祖", "lilin", "987明天","yao", "$89ada","_adgq","@%$^117", "房祖名", "光辉女郎", "43165hsk","gg123", "#^&hs", "梅艳芳", "123科比", "tom","Tom", "xiaoming000" }; List<String> list = new ArrayList<>(); List<List<String>> listGroup = chineseAndEnglishSortByChar(arrays); System.out.println("listGroup.size():"+listGroup.size()); for(int i = 0; i<listGroup.size();i++){ list.clear(); list = listGroup.get(i);// System.out.println("list.size("+i+"):"+list.size()); Iterator<String> iterator = list.iterator(); while(iterator.hasNext()){ System.out.print(iterator.next()+", "); } } }
阅读全文
0 0
- 特殊字符、数字开头,及中英文字符排序(类似通讯录)
- "\" 开头的特殊字符:
- 字符串中英文单词开头字符大小写转换
- js判断字符长度及中英文数字的例子
- 特殊字符中英文对照 (标点符号的英文)
- 正则表达式匹配大写,小写,数字及特殊字符
- 不同数字的特殊字符
- 读取文本中的数字(其中包含中英文字符)
- 中英文及数字混合排序
- 统计中英文字符,数字,空格个数
- 罗马字符及数字
- OracleParameter 的使用(参数名要以:开头,不允许包含@等特殊字符)
- 去掉一个文本中每行开头相同的特殊字符
- Linux如何删除以特殊字符开头的文件
- java 判断参数中是否以特殊字符开头
- 新建记事本时,开头有个特殊字符的处理
- Linux 通配符 及特殊字符 $、\、`、
- 随机字符串程序(支持数字,字母,汉字,特殊字符)
- RxJava操作符之过滤操作符(五)
- String、StringBuffer与StringBuilder之间区别
- mongodb java 排序 分页
- Ubuntu Docker 安装
- ChatterBot结构简述
- 特殊字符、数字开头,及中英文字符排序(类似通讯录)
- Hive 桶的分区
- ideal SVN的安装
- Unity3D Player角色移动控制脚本
- ie11下下载文件,文件名乱码的解决方法
- 阿里巴巴Java开发规约的插件使用
- Python内置函数sorted()和列表方法sort()排序规则不得不说的事
- OpenGL基本图元转换为GL_TRIANGLES
- JavaSE基础05