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

近期做项目需要实现组织用户下的个人用户按其名称排序,因此写了个按字符排序的工具类供大家参考

        这里按照字符串第一个字符,使用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()+", ");
            }
        }
    }
        
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值