1. 程式人生 > >統計字串中各英文字母出現的頻率並按頻度排序

統計字串中各英文字母出現的頻率並按頻度排序

直接上程式碼

public class StringTest {
    
    /**
     * 任意給定英文字串,求出各個字母出現的次數,並按照字母出現的次數從高到低排序。
     * 思路:
     * 1、先建立一個map,儲存對應的字母以及次數 key-value,
     * 2、自定義一個value的比較器Comparator,實現map按照key對應的value值排序。
     * 3、新建一個TreeMap,並傳入比較器自定義排序規則,將之前map複製到treemap中。
     * 4、遍歷treemap即為所求。
     * @param args
     */
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        String[] str ="shdfuehfhrufhdheufhfsjfuqoweptumnbvfutiypeyasywhylmnzbvcajdiwu".split("");
        Map<String,Integer> map = new HashMap<String, Integer>();
        for(int i=0;i<str.length;i++){
            if(map.containsKey(str[i])){
                int count = map.get(str[i]);
                map.put(str[i],count+1);
            }else{
                map.put(str[i],1);
            }
        }
        MapValueComparator mapValueComparator = new MapValueComparator(map);
        Map<String,Integer> sortmap = new TreeMap<String, Integer>(mapValueComparator);
        sortmap.putAll(map);
        System.out.println(sortmap.toString());
        
    }

}

class MapValueComparator<T extends Comparable<T>> implements Comparator<String> {
    private Map<String, T> map = null;

    public MapValueComparator(Map<String, T> map) {
        this.map = map;
    }

    public int compare(String o1, String o2) {
        int r = map.get(o2).compareTo(map.get(o1));
        if (r == 0) {
            r = 1;
        } 
        return r;
    }
}