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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈嘉宾 中级黑马   /  2012-6-20 12:56  /  2485 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈嘉宾 于 2012-6-20 17:44 编辑

统计字符串中字符出现的次数,通过比较方法打印出了按取出字符次数的排序,但是怎么把这个排序方法传入StringBuffer容器中,让它能按照这个方法打印出来呢??
通过value的比较后怎么放进容器中把比较后的方法打印出呢?现在这个打印结果是没调用排序方法的默认的字符排序。求高人指点
import java.util.*;
class xp
{
        public static void main(String[] args)
        {
                String s=charCount("abadcdffbaeba");
                System.out.println(s);
        }        
               
        public static String charCount(String str)
        {
                char[] chs=str.toCharArray();

                TreeMap<Character,Integer> tm =new TreeMap<Character,Integer>();
               
                int count =0;
                for(int x=0;x<chs.length;x++)
                {
                        Integer value=tm.get(chs[x]);

                        if(value!=null)
                                count=value;
                        count++;
                        tm.put(chs[x],count);
                        count=0;
                        
                }
                        
                        System.out.println(tm);
               
               
               
                List list=new ArrayList(tm.entrySet());
                Collections.sort(list,new Comparator()
                {
                        public int compare(Object o1,Object o2)
                        {
                                Map.Entry obj1 = (Map.Entry) o1;
                Map.Entry obj2 = (Map.Entry) o2;
                return ((Integer) obj1.getValue()).compareTo((Integer) obj2
                                .getValue());
                        }
                });
               
                        
               
                StringBuffer sb=new StringBuffer();
               
                Set<Map.Entry<Character,Integer>> entry=tm.entrySet();
                Iterator<Map.Entry<Character,Integer>>it=entry.iterator();
                while(it.hasNext())
                {
                        Map.Entry<Character,Integer>me=it.next();
                        Character ch=me.getKey();
                        Integer value=me.getValue();
                        sb.append(ch+"("+value+")");
                        
                }
                return sb.toString();
        }
        
                        
}                        
                        

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

16 个回复

倒序浏览
抱歉,没明白你想问什么,你的程序没啥问题的样子。
回复 使用道具 举报
同楼上,没明白你的意思?
回复 使用道具 举报
本帖最后由 李天甲 于 2012-6-20 13:55 编辑
  1. import java.util.*;

  2. /*统计字符串中字符出现的次数,通过比较方法打印出了按取出字符次数的排序,
  3. * 但是怎么把这个排序方法传入StringBuffer容器中,让它能按照这个方法打印出来呢??
  4. * 通过value的比较后怎么放进容器中把比较后的方法打印出呢?
  5. * 现在这个打印结果是没调用排序方法的默认的字符排序。*/
  6. class xp {
  7.         public static void main(String[] args) {
  8.                 String s = charCount("abadcdffbaeba");
  9.                 System.out.println(s);
  10.         }

  11.         public static String charCount(String str) {
  12.                 char[] chs = str.toCharArray();//将字符串转成字符数组
  13.                 TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();
  14.                 int count = 0;
  15.                 for (int x = 0; x < chs.length; x++) {
  16.                         Integer value = tm.get(chs[x]);
  17.                         if (value != null)
  18.                                 count = value;
  19.                         count++;
  20.                         tm.put(chs[x], count); //放进容器了
  21.                         count = 0;
  22.                 }
  23.                 System.out.println(tm); //打印出来了

  24.                 List<?> list = new ArrayList<Object>(tm.entrySet()); //list放入索引
  25.                 Collections.sort(list, new Comparator<Object>() {
  26.                         public int compare(Object o1, Object o2) {
  27.                                 Map.Entry obj1 = (Map.Entry) o1;
  28.                                 Map.Entry obj2 = (Map.Entry) o2;
  29.                                 //System.out.println("这是在干啥"+obj1);
  30.                                 return ((Integer) obj1.getValue()).compareTo((Integer) obj2
  31.                                                 .getValue());
  32.                         }
  33.                 });
  34.                 StringBuffer sb = new StringBuffer();               
  35.                 for(int x=0;x<list.size();x++){
  36.                         Map.Entry me=(Map.Entry)list.get(x);
  37.                         Character ch = (Character) me.getKey();
  38.                         Integer value = (Integer) me.getValue();
  39.                         sb.append(ch + "(" + value + ")");
  40.                 }
  41.                 return sb.toString();
  42.                
  43.                 /*StringBuffer sb = new StringBuffer();
  44.                 Set<Map.Entry<Character, Integer>> entry = tm.entrySet();
  45.                 Iterator<Map.Entry<Character, Integer>> it = entry.iterator();
  46.                 while (it.hasNext()) {
  47.                         Map.Entry<Character, Integer> me = it.next();
  48.                         Character ch = me.getKey();
  49.                         Integer value = me.getValue();
  50.                         sb.append(ch + "(" + value + ")");
  51.                 }
  52.                 return sb.toString();*/
  53.         }

  54. }
复制代码
呵呵,你的意思是这样么?我照猫画虎打了一个
请参见代码
呵呵,写成size-1了,笔误哈

回复 使用道具 举报
本帖最后由 陆强强 于 2012-6-20 13:42 编辑

http://bbs.itheima.com/thread-17473-1-1.html
楼主的意思是按集合的值来排序,一般默认的比较器都是按集合的键排序的
回复 使用道具 举报
李天甲 发表于 2012-6-20 13:33
呵呵,你的意思是这样么?我照猫画虎打了一个
请参见代码

我找到了一个错误。。for(int x=0;x<list.size()-1;x++)这里貌似不该-1吧打印出得元素少一个
回复 使用道具 举报
陈嘉宾 发表于 2012-6-20 13:51
我找到了一个错误。。for(int x=0;x

哈哈,笔误笔误....错了呵呵
回复 使用道具 举报
李天甲 发表于 2012-6-20 13:33
呵呵,你的意思是这样么?我照猫画虎打了一个
请参见代码
呵呵,写成size-1了,笔误哈

能帮我解释一下这个方法吗?List<?> list = new ArrayList<Object>(tm.entrySet());加入泛型就可以?到底怎么实现的。。
回复 使用道具 举报
李天甲 发表于 2012-6-20 13:56
哈哈,笔误笔误....错了呵呵

Map.Entry me=(Map.Entry)list.get(x);还有这句。。hello?
回复 使用道具 举报
在的,刚才没刷新,呵呵,看不到您的回复,不好意思
回复 使用道具 举报
List<?> list = new ArrayList<Object>(tm.entrySet());
这里面的<?>实际上就是后面实例的object.偶这里瞎写的...
实际上应该写<Object>,但是不写没啥事情呵呵.

Map.Entry me=(Map.Entry)list.get(x);
和上面一样啊,你传入的list里面的值对实际上是Map.Entry类型的,所以我强转了..
严谨的不用强转的写法大概是这样吧
List<Map.Entry> list = new ArrayList<Map.Entry>(tm.entrySet());
然后下面直接就写
Map.Entry me=list.get(x);
不用强转呵呵...

回复 使用道具 举报
李天甲 发表于 2012-6-20 14:22
List list = new ArrayList(tm.entrySet());
这里面的实际上就是后面实例的object.偶这里瞎写的...
实际上 ...

可是我的那个就调入不了那个比较方法。不知道是哪的错呢。。。
回复 使用道具 举报
李天甲 发表于 2012-6-20 14:22
List list = new ArrayList(tm.entrySet());
这里面的实际上就是后面实例的object.偶这里瞎写的...
实际上 ...

可是我的那个就调入不了那个比较方法。不知道是哪的错呢。。。
回复 使用道具 举报

你是这个意思么?呵呵,
参见代码
  1.                 List<Map.Entry> list = new ArrayList<Map.Entry>(tm.entrySet()); //list放入索引
  2.                 Collections.sort(list,
  3.                         new Comparator<Map.Entry>() {
  4.                                 public int compare(Map.Entry o1, Map.Entry o2) {
  5.                                         return ((Integer) o1.getValue()).compareTo((Integer) o2.getValue());
  6.                                 }
  7.                 });
复制代码
回复 使用道具 举报
李天甲 发表于 2012-6-20 14:50
你是这个意思么?呵呵,
参见代码

List list=new ArrayList(tm.entrySet());
                Collections.sort(list,new Comparator()
                {
                        public int compare(Object o1,Object o2)
                        {
                                Map.Entry obj1 = (Map.Entry) o1;
                Map.Entry obj2 = (Map.Entry) o2;
                return ((Integer) obj1.getValue()).compareTo((Integer) obj2
                                .getValue());
我这步跟你这步意思是一样的,就是你的方法怎么能调用这个方法,而我的没有调用。。
回复 使用道具 举报
请参见java API ,其中sort(List<T> list, Comparator<? super T> c)
这里Comparator<? super T>中泛型进行向上限定了,我感觉如果你new Comparator<Map.Entry>() 这里泛型什么不写,
自然向上到头就是object了.

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
李天甲 发表于 2012-6-20 15:12
请参见java API ,其中sort(List list, Comparator

恩,明白了主要我下面做的StringBuffer也有问题谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马