美文网首页
TreeMap自然排序

TreeMap自然排序

作者: ShrJanLan | 来源:发表于2020-11-20 11:52 被阅读0次

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();
    }

}

相关文章

  • lambda HashMap 排序

    TreeMap 按key排序生成map可以有TreeMap 完成,TreeMap可以按key的自然顺序排序(Com...

  • TreeMap用法总结

    TreeMap用法总结 TreeMap中的元素默认按照keys的自然排序排列。 (对Integer来说,其自然排序...

  • TreeMap自然排序

    TreeMap键不能重复,键排序返回“0”时,o2覆盖o1 键排序(降序更换两个比较对象位置即可) 值排序 汉字转...

  • TreeMap的用法

    构造方法 // 默认构造函数。使用该构造函数,TreeMap中的元素按照自然排序进行排列。TreeMap() //...

  • Java-Map

    TreeMap TreeMap基于红黑树(Red-Black tree)实现。该映射根据其键的自然顺序进行排序,或...

  • Java集合源码分析-TreeMap

    成员变量: 可以看出有一个排序器变量comparator,可以知道TreeMap是可以排序的(默认自然排序,或者自...

  • TreeSet

    TreeSet的特点:1、排序:1)自然排序2)比较器排序 2、唯一:底层通过TreeMap实现了元素的唯一性。 ...

  • JAVA8 TreeSet学习笔记

    TreeSet TreeSet是基于TreeMap的NavigableSet实现。使用元素的自然顺序对元素进行排序...

  • TreeMap简介

    TreeMap是支持排序的map,基于红黑树,无容量限制,TreeMap非线程安全。 TreeMap继承Abstr...

  • TreeMap源码分析

    一.TreeMap的特性 TreeMap是有序的,可以自定义排序规则,如果不指定则按照默认的规则排序 二.Tree...

网友评论

      本文标题:TreeMap自然排序

      本文链接:https://www.haomeiwen.com/subject/viddiktx.html