解决方法代码如下:
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
public class CountTimes4String {
public static void main(String[] args) {
String src = "zaabbbccddd";
Map map = charTimes(src);
System.out.println(map);
}
/**
* 返回一个字符串中字符出现次数的map集合(按出现次数排序)
*
* @param src
* 接收一个字符串
* @return 字符串中字符与出现次数的对应关系Map集合(按出现次数排序)
*/
public static Map<Character, Integer> charTimes(String src) {
Map<Character, Integer> map = new LinkedHashMap<Character, Integer>();
// 建立每个字符和出现次数的map
char[] charArr = src.toCharArray();
for (char c : charArr)
if (map.get(c) == null)
map.put(c, 1);
else
map.put(c, map.get(c) + 1);
/*
* 思路:因为map集合无法直接通过值排序,使用带排序功能的TreeSet来排序好后再存入Map,
* 需要保留存储顺序,所以使用LinkedHashMap
*/
Set<Map.Entry<Character, Integer>> set = new TreeSet<Map.Entry<Character, Integer>>( // 建立一个可以接受Map.Entry类型对象的集合,并按照比较器排序
new Comparator<Map.Entry<Character, Integer>>() { // 实现Map.Entry对象按值排序的内部类
public int compare(Map.Entry<Character, Integer> o1,
Map.Entry<Character, Integer> o2) {
return o1.getValue() - o2.getValue() == 0 ? o1.getKey()
.compareTo(o2.getKey()) : o1.getValue()
- o2.getValue();
}
});
set.addAll(map.entrySet()); // 实现Map.Entry对象按值排序
map.clear();
for (Map.Entry<Character, Integer> e : set)
map.put(e.getKey(), e.getValue());
return map;
}
}
运行结果为:
{z=1, a=2, c=2, b=3, d=3}
希望能对你有所帮助 |