近期做项目需要实现组织用户下的个人用户按其名称排序,因此写了个按字符排序的工具类供大家参考
这里按照字符串第一个字符,使用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()+", ");
}
}
}