特殊字符、数字开头,及中英文字符排序(类似通讯录)

来源:互联网 发布:阿里云网站搭建流程 编辑:程序博客网 时间: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()+", ");            }        }    }
        
原创粉丝点击