A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Destiny 中级黑马   /  2012-3-24 16:44  /  3441 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

毕老师第16天视频里说了个  练习:
"sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数。
这个输出时按字母顺序排序的,那如果我想让它按次数从小到大排序该怎么弄?
是不是要重新写一个比较器?  那比较器怎么穿进去呢? 我写了个代码,不知道对不对,主要是不知道怎么传比较器。请大家帮忙
  1. import java.util.*;

  2. class CharComparator implements Comparator< Map.Entry<Character,Integer>>
  3. {
  4.         public int compare(Map.Entry<Character,Integer> c1,Map.Entry<Character,Integer> c2)
  5.         {
  6.                 int num = c1.getValue().compareTo(c2.getValue());
  7.                
  8.                 return num;
  9.         }
  10. }
  11. class  Demo7
  12. {
  13.         public static void main(String[] args)
  14.         {
  15.                 String s= charCount("ak+abAf1c,dCkaAbc-defa");
  16.                 System.out.println(s);
  17.         }
  18.         //字符统计方法
  19.         public static String charCount(String str)
  20.         {
  21.                 char[] chs = str.toCharArray();

  22.                 TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();// 定义一个字符与数字对应的集合
  23.                
  24.                 int count = 0;//计数器
  25.                 for(int x=0; x<chs.length; x++)
  26.                 {
  27.                         if(!(chs[x]>='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))
  28.                                 continue;

  29.                         Integer value = tm.get(chs[x]);

  30.                         if(value!=null)
  31.                                 count = value;
  32.                         count++;
  33.                         tm.put(chs[x],count);//直接往集合中存储字符和数字,自动装箱。

  34.                         count = 0;//计数器置0
  35.                

  36.                 }

  37.                 StringBuilder sb = new StringBuilder();//定义一个字符串缓冲区,用于存放集合中的内容

  38.                 Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();
  39.                
  40.                 Iterator<Map.Entry<Character,Integer>>  it = entrySet.iterator();

  41.                 while(it.hasNext())
  42.                 {
  43.                         Map.Entry<Character,Integer> me = it.next();
  44.                         Character ch = me.getKey();
  45.                         Integer value = me.getValue();
  46.                         sb.append(ch+":"+value+",");
  47.                 }

  48.                 return sb.toString();
  49.         }

  50. }
复制代码

7 个回复

倒序浏览
TreeMap(Comparator<? super K> comparator)  TreeMap的构造函数里就可以直接传一个比较器

当你定义Map集合的时候可以 把比较器当参数传递给集合的构造函数即可
如下:
  TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>(CharComparator);   
回复 使用道具 举报
刘元霄 发表于 2012-3-24 16:59
TreeMap(Comparator

嗯 好的 我试试~!
回复 使用道具 举报
刘元霄 发表于 2012-3-24 16:59
TreeMap(Comparator

貌似不行哎~能不能贴个完整代码
回复 使用道具 举报
Destiny 发表于 2012-3-24 17:09
貌似不行哎~能不能贴个完整代码

TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>(new CharComparator());    直接new一个比较器进TreeMap 好多代码,我在看教程写不出来, 你去API 看看 有帮助的。
回复 使用道具 举报
Destiny 发表于 2012-3-24 17:06
嗯 好的 我试试~!

我复制你的代码试了下 好像什么比较器不适用。
回复 使用道具 举报
本帖最后由 了无尘 于 2012-3-25 07:35 编辑

教你个最简单的办法,一次遍历就行
  1. public class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 //统计字符串中英文字符的出现次数
  6.                 String string = "sdfgzxcvasdfxcvdf";
  7.                 char[] c = string.toCharArray();
  8.                 //用来保存26个英文字母出现的次数
  9.                 //该数组0为a 25为z
  10.                 //使用时以字符的ascii码值减去97
  11.                 //因为a字符的ascii值为97
  12.                 //这里的ascii编码表其实就是张map
  13.                 int[] temp = new int[26];
  14.                 for(char ch : c)
  15.                 {
  16.                         temp[ch-97] ++;
  17.                 }
  18.                
  19.                 for(char d = 'a'; d < 'z' + 1; d++)
  20.                 {
  21.                         System.out.println("" + d + "出现了" + temp[d-97] + "次");
  22.                 }
  23.         }
  24. }
复制代码
回复 使用道具 举报
张锐 中级黑马 2012-4-14 11:16:41
8#
呵呵 这道题我的解决方案是先用一个map把算好次数的存进去,也就是你实现的这步。然后再创建一个map,这时候我们可以把刚才的那个map传入一个比较器,然后规则为根据字符出现的多少排序,再put进这个新map就实现了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马