Comparable和Comparator


import lombok.Builder;
import lombok.Data;

import java.io.Serializable;

/**
 * @描述 :
 * @作者 fangdayang
 * @date 2020/9/26 12:43
 */
@Data
@Builder
public class Person implements Comparable<Person>, Serializable {
    private static final long serialVersionUID = 5463826748719272438L;
    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private Integer age;
    /**
     * 性别
     */
    private String gender;

    public Person() {
    }

    public Person(String name, Integer age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    @Override
    public int compareTo(Person o) {
        int i = this.getAge() - o.getAge();
        return -i;
    }
}


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.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

public class PinyinUtils {
    /**
     * 将汉字转换为全拼
     *
     * @param src
     * @return String
     */
    public static String getPinYin(String src) {
        char[] t1 = null;
        t1 = src.toCharArray();
        String[] t2 = new String[t1.length];
        // 设置汉字拼音输出的格式
        HanyuPinyinOutputFormat t3 = new HanyuPinyinOutputFormat();
        t3.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        t3.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        t3.setVCharType(HanyuPinyinVCharType.WITH_V);
        String t4 = "";
        int t0 = t1.length;
        try {
            for (int i = 0; i < t0; i++) {
                // 判断是否为汉字字符
                if (Character.toString(t1[i]).matches("[\\u4E00-\\u9FA5]+")) {
                    t2 = PinyinHelper.toHanyuPinyinStringArray(t1[i], t3);// 将汉字的几种全拼都存到t2数组中
                    t4 += t2[0];// 取出该汉字全拼的第一种读音并连接到字符串t4后
                } else {
                    // 如果不是汉字字符,直接取出字符并连接到字符串t4后
                    t4 += Character.toString(t1[i]);
                }
            }
        } catch (BadHanyuPinyinOutputFormatCombination e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return t4;
    }

    /**
     * 提取每个汉字的首字母
     *
     * @param str
     * @return String
     */
    public static String getPinYinHeadChar(String str) {
        String convert = "";
        for (int j = 0; j < str.length(); j++) {
            char word = str.charAt(j);
            // 提取汉字的首字母
            String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
            if (pinyinArray != null) {
                convert += pinyinArray[0].charAt(0);
            } else {
                convert += word;
            }
        }
        return convert;
    }

    /**
     * 将字符串转换成ASCII码
     *
     * @param cnStr
     * @return String
     */
    public static String getCnASCII(String cnStr) {
        StringBuffer strBuf = new StringBuffer();
        // 将字符串转换成字节序列
        byte[] bGBK = cnStr.getBytes();
        for (int i = 0; i < bGBK.length; i++) {
            // 将每个字符转换成ASCII码
            strBuf.append(Integer.toHexString(bGBK[i] & 0xff) + " ");
        }
        return strBuf.toString();
    }

}
        <!--加入如下:拼音的jar包-->
        <dependency>
            <groupId>com.belerweb</groupId>
            <artifactId>pinyin4j</artifactId>
            <version>2.5.1</version>
        </dependency>
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Random;

/**
 * @描述 :Comparable和Comparator
 * @作者 fangdayang
 * @date 2020/9/26 13:04
 */
public class MainComparable {
//    public static char[] chars=
//            {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    public static void main(String[] args) {
        ArrayList<Person> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Person p1 = new Person("小明" + i, 30 + i, new Random().nextInt(2) == 1 ? "男" : "女");
            list.add(p1);
        }
        Random random = new Random();
        System.out.println(random.nextInt(2));
        Collections.sort(list);
        // person对象已经实现了根据age的排序 这里增加了对gender的排序
        Collections.sort(list, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                String gender = o1.getGender();
                String pinYin = PinyinUtils.getPinYin(gender);
                System.out.println(pinYin);
                String gender1 = o2.getGender();
                String pinYin1 = PinyinUtils.getPinYin(gender1);
                System.out.println(pinYin1);
                char[] pinyinChars = pinYin.toCharArray();
                char[] pinyinChars2= pinYin1.toCharArray();
                int length = pinyinChars.length;
                int length2 = pinyinChars2.length;
                int lim = length2 - length>0?length:length2;
                int k = 0;
                while (k < lim) {
                    char c1 = pinyinChars[k];
                    char c2 = pinyinChars2[k];
                    if (c1 != c2) {
                        return c1 - c2;
                    }
                    k++;
                }
                return length - length2;
            }
        });
        list.stream().forEach(person-> System.out.println(person));
//
//        char a = 'a';
//        int i = a + 1;
//        System.out.println(((char) i));
//        StringBuilder builder = new StringBuilder("'a',");
//        for (int j = 1; j <= 26; j++) {
//            builder.append("'"+((char) (a + j))+"',");
//        }
//        System.out.println(builder);
    }
}
posted @ 2020-09-26 13:55  自然的风和雨  阅读(97)  评论(0)    收藏  举报