黑马程序员技术交流社区

标题: 练习:记录字母出现次数并排序 [打印本页]

作者: Synaric    时间: 2015-10-8 08:58
标题: 练习:记录字母出现次数并排序
  1. import java.util.Comparator;
  2. import java.util.Map.Entry;
  3. import java.util.TreeMap;

  4. /*
  5. * 需求:1、统计字符串中每个字母出现的次数
  6. *      例如"sjokafjoilnvoaxllvkasjdfns",希望打印a(1)d(1)...
  7. *      2、非字母不计
  8. *      3、字母按a-zA-Z排序
  9. * 思路:1、输出数据有明显的映射关系,且自然排序,应该用TreeMap,传入比较器初始化
  10. *      2、对字符串遍历,对于每个字符,若存在于TreeeMap中,将值+1;若不在,存入TreeMap
  11. */
  12. public class MapDemo_2 {
  13.         public static void main(String[] args) {
  14.                 String string = "sjoAkaf+joilnBFJoax llA@vkasJdfns";
  15.                 count(string, new CharComparator());
  16.         }
  17.        
  18.         static void count(String string, CharComparator cc){
  19.                 //创建一个结果集
  20.                 TreeMap<Character, Integer> ciMap = new TreeMap<Character, Integer>(cc);
  21.                
  22.                 //对字符串的每个字符遍历
  23.                 for (int i = 0; i < string.length(); ++i) {
  24.                         char c = string.charAt(i);
  25.                        
  26.                         //判断是否字母
  27.                         if(c<65 || 90<c && c<97 || 122<c)
  28.                                 continue;
  29.                        
  30.                         //查询集合获得计数,+1存入集合
  31.                         //若没查找到,新建信息存入集合
  32.                         if(ciMap.containsKey(c)){
  33.                                 ciMap.put(c, (ciMap.get(c) + 1));
  34.                         }else{
  35.                                 ciMap.put(c, 1);
  36.                         }
  37.                 }
  38.                
  39.                 //遍历集合输出
  40.                 showCount(ciMap);
  41.         }
  42.        
  43.         static void showCount(TreeMap<Character, Integer> ciMap){
  44.                 for(Entry<Character, Integer> entry : ciMap.entrySet()){
  45.                         System.out.print(entry.getKey() + "(" + entry.getValue() + ")");
  46.                 }
  47.         }
  48.        
  49.         //自定义的比较器,按a-zA-Z排序
  50.         static class CharComparator implements Comparator<Character>{
  51.                 @Override
  52.                 public int compare(Character o1, Character o2) {
  53.                         int result = range(o1, o2);
  54.                        
  55.                         //若在不同区间
  56.                         //区分a-z与A-Z两个区间的大小
  57.                         if(0 != result) return result;
  58.                        
  59.                         //若在同一区间,直接比较
  60.                         return o1.compareTo(o2);
  61.                 }
  62.                
  63.                 //若c1、c2在不同集合中,a-z为小,A-Z为大
  64.                 //若在相同集合中,返回0
  65.                 private int range(char c1, char c2){
  66.                         int i = 1, j = 1;
  67.                         if(c1 >= 97) i = 0;
  68.                         if(c2 >= 97) j = 0;
  69.                        
  70.                         if(i == j) return 0;
  71.                        
  72.                         if(i > j) return 1; else return -1;
  73.                 }
  74.         }
  75. }
复制代码







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2