TreeMap自然排序

2020-11-20  本文已影响0人  ShrJanLan

TreeMap键不能重复,键排序返回“0”时,o2覆盖o1

//o1大于o2返回负数,o1小于o2返回正数(保持原有顺序)
//o1与o2相等返回“0”
o1.compareTo(o2);

键排序(降序更换两个比较对象位置即可)

        TreeMap<String,String> treeMap = new TreeMap<>(new Comparator<String>(){
            @Override
            public int compare(String o1,String o2){
                int o1len = o1.length();
                int o2len = o2.length();
                String o1py = PinyinUtils.ToPinyin(o1);
                String o2py = PinyinUtils.ToPinyin(o2);
                int o1pylen = PinyinUtils.ToPinyin(o1).length();
                int o2pylen = PinyinUtils.ToPinyin(o2).length();
                if (!o1py.equals(o1) && !o2py.equals(o2)) {
                    //中文排序
                    return o1pylen==o2pylen ? o1py.compareTo(o2py) : o1pylen-o2pylen;
                } else {
                    return o1len==o2len ? o1.compareTo(o2) : o1len-o2len;
                }
            }
        });
        treeMap.put("属性1", "7");
        treeMap.put("属性10", "3");
        treeMap.put("属性2", "a");
        treeMap.put("属性3", "a");

        for(Map.Entry<String,String> map : treeMap.entrySet()){
            System.out.println(map.getKey()+":"+map.getValue());
        }

值排序

        TreeMap<String,String> treeMap = new TreeMap<>();
        treeMap.put("7", "属性1");
        treeMap.put("3", "属性10");
        treeMap.put("a", "属性2");
        treeMap.put("d", "属性2");
        ArrayList<Map.Entry<String,String>> mapList = new ArrayList<>(treeMap.entrySet());
        Collections.sort(mapList, new Comparator<Map.Entry<String, String>>() {
            @Override
            public int compare(Map.Entry<String, String> map1, Map.Entry<String, String> map2) {
                String o1 = map1.getValue().toLowerCase();
                String o2 = map2.getValue().toLowerCase();
                int o1len = o1.length();
                int o2len = o2.length();
                String o1py = PinyinUtils.ToPinyin(o1);
                String o2py = PinyinUtils.ToPinyin(o2);
                int o1pylen = PinyinUtils.ToPinyin(o1).length();
                int o2pylen = PinyinUtils.ToPinyin(o2).length();
                if (!o1py.equals(o1) && !o2py.equals(o2)) {
                    //中文排序
                    return o1pylen==o2pylen ? o1py.compareTo(o2py) : o1pylen-o2pylen;
                } else {
                    return o1len==o2len ? o1.compareTo(o2) : o1len-o2len;
                }
            }
        });

        for(Map.Entry<String,String> map : mapList){
            System.out.println(map.getKey()+":"+map.getValue());
        }

汉字转拼音工具类

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;

/**
 * @description: 汉字转换为拼音
 */
public class PinyinUtils {

    /**
     * 获取汉字拼音的第一个字母
     * @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].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 ToPinyinUpperCase(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();
    }

}
上一篇 下一篇

猜你喜欢

热点阅读