- import java.util.Comparator;
- import java.util.Map.Entry;
- import java.util.TreeMap;
- /*
- * 需求:1、统计字符串中每个字母出现的次数
- * 例如"sjokafjoilnvoaxllvkasjdfns",希望打印a(1)d(1)...
- * 2、非字母不计
- * 3、字母按a-zA-Z排序
- * 思路:1、输出数据有明显的映射关系,且自然排序,应该用TreeMap,传入比较器初始化
- * 2、对字符串遍历,对于每个字符,若存在于TreeeMap中,将值+1;若不在,存入TreeMap
- */
- public class MapDemo_2 {
- public static void main(String[] args) {
- String string = "sjoAkaf+joilnBFJoax llA@vkasJdfns";
- count(string, new CharComparator());
- }
-
- static void count(String string, CharComparator cc){
- //创建一个结果集
- TreeMap<Character, Integer> ciMap = new TreeMap<Character, Integer>(cc);
-
- //对字符串的每个字符遍历
- for (int i = 0; i < string.length(); ++i) {
- char c = string.charAt(i);
-
- //判断是否字母
- if(c<65 || 90<c && c<97 || 122<c)
- continue;
-
- //查询集合获得计数,+1存入集合
- //若没查找到,新建信息存入集合
- if(ciMap.containsKey(c)){
- ciMap.put(c, (ciMap.get(c) + 1));
- }else{
- ciMap.put(c, 1);
- }
- }
-
- //遍历集合输出
- showCount(ciMap);
- }
-
- static void showCount(TreeMap<Character, Integer> ciMap){
- for(Entry<Character, Integer> entry : ciMap.entrySet()){
- System.out.print(entry.getKey() + "(" + entry.getValue() + ")");
- }
- }
-
- //自定义的比较器,按a-zA-Z排序
- static class CharComparator implements Comparator<Character>{
- @Override
- public int compare(Character o1, Character o2) {
- int result = range(o1, o2);
-
- //若在不同区间
- //区分a-z与A-Z两个区间的大小
- if(0 != result) return result;
-
- //若在同一区间,直接比较
- return o1.compareTo(o2);
- }
-
- //若c1、c2在不同集合中,a-z为小,A-Z为大
- //若在相同集合中,返回0
- private int range(char c1, char c2){
- int i = 1, j = 1;
- if(c1 >= 97) i = 0;
- if(c2 >= 97) j = 0;
-
- if(i == j) return 0;
-
- if(i > j) return 1; else return -1;
- }
- }
- }
复制代码
|
|