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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李罡 中级黑马   /  2013-3-18 09:29  /  1489 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李罡 于 2013-3-18 18:54 编辑
  1. import java.util.*;

  2. class CharComparator implements Comparator<Zimu>
  3. {
  4. public int compare(Zimu z1,Zimu z2)
  5. {
  6. return new Character(z1.getName()).compareTo(new Character(z2.getName()));
  7. }
  8. }

  9. class Zimu
  10. {
  11. private char z;
  12. Zimu(char z)
  13. {
  14. this.z=z;
  15. }
  16. public char getName()
  17. {
  18. return z;
  19. }
  20. }
  21. class MapTest3
  22. {
  23. public static void main(String[] args)
  24. {
  25. String s= charCount("ak+abAf1c,dCkaAbc-defa");
  26. System.out.println(s);
  27. }

  28. public static String charCount(String str)
  29. {
  30. char[] chs = str.toCharArray();

  31. TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>(new CharComparator());//为什么这里加个比较器就不行了


  32. int count = 0;
  33. for(int x=0; x<chs.length; x++)
  34. {


  35. if(!(chs[x]>='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))
  36. continue;

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


  38. if(value!=null)
  39. count = value;
  40. count++;
  41. tm.put(chs[x],count);//

  42. count = 0;
  43. }

  44. //System.out.println(tm);

  45. StringBuilder sb = new StringBuilder();

  46. Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();
  47. Iterator<Map.Entry<Character,Integer>> it = entrySet.iterator();

  48. while(it.hasNext())
  49. {
  50. Map.Entry<Character,Integer> me = it.next();
  51. Character ch = me.getKey();
  52. Integer value = me.getValue();
  53. sb.append(ch+"("+value+")");
  54. }
  55. return sb.toString();
  56. }

  57. }


  58. 加了比较器以后,显示:
  59. 错误: 对于TreeMap(CharComparator), 找不到合适的构造器
  60. TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>(n
  61. ew CharComparator());


  62. 老师写的代码中是没有加比较器的,运行没问题的。可为什么我加了比较器以后编译就无法通过
  63. 了呢?比较器该怎么加呢?
  64. 另外可以说说hashset和treeset,compare和compareTo的区别吗
复制代码

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

6 个回复

倒序浏览
  1. import java.util.Comparator;
  2. import java.util.Iterator;
  3. import java.util.Map;
  4. import java.util.Set;
  5. import java.util.TreeMap;

  6. class CharComparator implements Comparator<Zimu>
  7. {
  8. public int compare(Zimu z1,Zimu z2)
  9. {
  10. return new Character(z1.getName()).compareTo(new Character(z2.getName()));
  11. }
  12. }

  13. class Zimu
  14. {
  15. private char z;
  16. Zimu(char z)
  17. {
  18. this.z=z;
  19. }
  20. public char getName()
  21. {
  22. return z;
  23. }
  24. }
  25. class MapTest3
  26. {
  27. public static void main(String[] args)
  28. {
  29. String s= charCount("ak+abAf1c,dCkaAbc-defa");
  30. System.out.println(s);
  31. }

  32. public static String charCount(String str)
  33. {
  34. char[] chs = str.toCharArray();

  35. TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>(new CharComparator());//为什么这里加个比较器就不行了
  36. // 因为类TreeMap中没有该构造方法


  37. int count = 0;
  38. for(int x=0; x<chs.length; x++)
  39. {


  40. if(!(chs[x]>='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))
  41. continue;

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


  43. if(value!=null)
  44. count = value;
  45. count++;
  46. tm.put(chs[x],count);//

  47. count = 0;
  48. }

  49. //System.out.println(tm);

  50. StringBuilder sb = new StringBuilder();

  51. Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();
  52. Iterator<Map.Entry<Character,Integer>> it = entrySet.iterator();

  53. while(it.hasNext())
  54. {
  55. Map.Entry<Character,Integer> me = it.next();
  56. Character ch = me.getKey();
  57. Integer value = me.getValue();
  58. sb.append(ch+"("+value+")");
  59. }
  60. return sb.toString();
  61. }

  62. }
复制代码
回复 使用道具 举报
陈团辉 发表于 2013-3-18 10:16

还是运行不了啊
回复 使用道具 举报
本帖最后由 谢洋 于 2013-3-18 16:32 编辑

对不起,弄错了,你所看到的贴子不存在
回复 使用道具 举报
上面是直接Copy API文档出现的恶果,偷懒要不得删不掉啊,
TreeMap(Comparator<? super K> comparator)
TreeMap(Map<? extends K,? extends V> m)

先解说下上面的API文档:
Comparator<? super K> comparator //表示该比较器要比较的泛型实参是K(键)类或其父类,
你的键是TreeMap<Character,Integer>中的Character,也就是说,你自定义的比较器的泛型实参必须是Character类型或者Character的父类;
但是你下定义的比较器是的泛型实参是:Zimu;那么在存入过程中,是拿Character类参传给compare(Zimu z1,Zimu z2)中的Zimu类型进行比较,
第二个构造不用说了吧,

你下面是你的比较器
class CharComp implements Comparator<Zimu>
{
public int compare(Zimu z1,Zimu z2)
{
  return new Character(z1.getName()).compareTo(new Character(z2.getName()));
}
}

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
若还有问题,请继续追问,没有的话,请将帖子分类改成【已解决】~
回复 使用道具 举报
李罡 中级黑马 2013-3-18 18:54:03
7#
谢洋 发表于 2013-3-18 16:31
上面是直接Copy API文档出现的恶果,偷懒要不得删不掉啊,
TreeMap(Comparator

谢谢!我已经想明白了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马