JAVA实现对包含数字、字母、中文的字符串按首字母排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zj20142213/article/details/80849354

最近项目中有新的需求,需要对包含数字、字母、中文的字符串按首字母排序。看似简单,但是实现起来却很难。因为这里面包含了中文,不能单纯的取首字母的ASSIC值进行比较。考虑到最终是根据英文字母进行比较的,索性将字符串统统转化成字符串进行处理。具体的代码如下。


   PinyinUtils.java
package com.fangshuo;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

/**
 * 汉字转换为拼音
 * @author Red
 */
public class PinyinUtils {
    /**
     * 获取字符串拼音的第一个字母
     * @param chinese
     * @return
     */
    public static String ToFirstChar(String chinese){         
        String pinyinStr = "";  
        char[] newChar = chinese.toCharArray();  //转为单个字符
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat(); 
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);  
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);  
        for (int i = 0; i < newChar.length; i++) {  
            if (newChar[i] > 128) {  
                try {  
                    pinyinStr += PinyinHelper.toHanyuPinyinStringArray(newChar[i], defaultFormat)[0].charAt(0);  
                } catch (BadHanyuPinyinOutputFormatCombination e) {  
                    e.printStackTrace();  
                }  
            }else{  
                pinyinStr += newChar[i];  
            }  
        }  
        return pinyinStr;  
    }  

    /**
     * 汉字转为拼音
     * @param chinese
     * @return
     */
    public static String ToPinyin(String chinese){          
        String pinyinStr = "";  
        char[] newChar = chinese.toCharArray();  
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();  
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);  
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);  
        for (int i = 0; i < newChar.length; i++) {  
            if (newChar[i] > 128) {  
                try {  
                    pinyinStr += PinyinHelper.toHanyuPinyinStringArray(newChar[i], defaultFormat)[0];  
                } catch (BadHanyuPinyinOutputFormatCombination e) {  
                    e.printStackTrace();  
                }  
            }else{  
                pinyinStr += newChar[i];  
            }  
        }  
        return pinyinStr;  
    }

    /**
     * 汉字转为拼音并获取大写的首字母;
     * @param chinese
     * @return
     */
    public static String ToPinyinAndGetFirstChar(String chinese){          
        String pinyinStr = "";  
        char[] newChar = chinese.toCharArray();  
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();  
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);  
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);  
        for (int i = 0; i < newChar.length; i++) {  
            if (newChar[i] > 128) {  
                try {  
                    pinyinStr += PinyinHelper.toHanyuPinyinStringArray(newChar[i], defaultFormat)[0];  
                } catch (BadHanyuPinyinOutputFormatCombination e) {  
                    e.printStackTrace();  
                }  
            }else{  
                pinyinStr += newChar[i];  
            }  
        }  
        return pinyinStr.toUpperCase();
    }  
}

测试载体Students.java

package com.fangshuo;

public class Students {  
    private int age;  
    private int score;
    private String name;

    public Students() {
        super();
    }

    public Students(int age, int score, String name) {
        super();
        this.age = age;
        this.score = score;
        this.name = name;
    }

    public Students(int age, int score){  
        super();  
        this.age = age;  
        this.score = score;  
    }  

    public int getAge() {  
        return age;  
    }  
    public void setAge(int age) {  
        this.age = age;  
    }  
    public int getScore() {  
        return score;  
    }  
    public void setScore(int score) {  
        this.score = score;  
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }  

}  


测试类:

package com.fangshuo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortTest {
    public static void main(String[] args) {
         List<Students> students = new ArrayList<Students>();  
         students.add(new Students(23, 100,"阿里azj001"));  
         students.add(new Students(27, 98,"腾讯bzj002"));  
         students.add(new Students(29, 99,"百度dzj003"));  
         students.add(new Students(29, 98,"华为czj004"));  
         students.add(new Students(22, 89,"择天ezj005"));  

         students.add(new Students(22, 89,"a择天ezj005"));  
         students.add(new Students(22, 89,"A择天ezj005"));  

         students.add(new Students(22, 89,"8择天ezj005"));  
         students.add(new Students(22, 89,"0择天ezj005"));  

         students.add(new Students(22, 89,"z择天ezj005"));  

         students.add(new Students(22, 89,"_z择天ezj005"));  
         Collections.sort(students, new Comparator<Students>() {  
             @Override  
             public int compare(Students o1, Students o2) {
                Students newo1 = new Students();
                newo1.setName(PinyinUtils.ToPinyinAndGetFirstChar(o1.getName()));
                Students newo2 = new Students();
                newo2.setName(PinyinUtils.ToPinyinAndGetFirstChar(o2.getName()));
                int i = newo1.getName().substring(0, 1).compareTo(newo2.getName().substring(0, 1));
                 return i;
             }
         });  
         for(Students stu : students){  
             System.out.println("score:" + stu.getScore() + ":age" + stu.getAge()+":name:"+stu.getName());  
         }  
    }
}

执行结果如下:
这里写图片描述

知识点:
字符串比较大小,可以使用现有的工具类:int result = str1.compareTo(str2);该方法返回两者的ASSIC 码的差值;

猜你喜欢

转载自blog.csdn.net/zj20142213/article/details/80849354
今日推荐