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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 韩慧阳 于 2012-5-17 15:14 编辑

毕老师视频中这样一个例子:找出字符串中每个字符出现的次数。
import java.util.*;
class  charCountTest implements Comparable<>
{
        public static void main(String[] args)
        {
                String s=charCount("aabbccfcdddd");
                System.out.println(s);
        }
        public static String charCount(String str)
        {
                char[] s=str.toCharArray();
                TreeMap<Character,Integer> tm=new TreeMap<Character,Integer>();
                int count=0;
                for(int x=0;x<s.length;x++)
                {
                        if(!(s[x]>='a' && s[x]<='z'  ||  s[x]>='A' && s[x]<='Z'))
                                continue;
                        Integer value=tm.get(s[x]);
                        if(value!=null)
                        {
                                count=value;
                        }
                        count++;
                        tm.put(s[x],count);
                        count=0;
                }
                StringBuilder sb=new StringBuilder();
                Set<Map.Entry<Character,Integer>> entrySet=tm.entrySet();
                Iterator<Map.Entry<Character,Integer>> it=entrySet.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();
        }
        
}
这个里面的键是Character,因为在Character中默认实现了Comparable的compareTo,所以本身就具备了比较性。
如果我想用Value做比较并输出怎么做?
映射依然是<Character,Integer> ,输出结果按照字符出现次数的大小排序,也就是说把Value作为比较条件。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
按照网上的指导,下面的代码,是我以前写的。你可以看一下。简单说,就是一个静态函数,一个构造函数的使用。
  1. public class TreeMapList {

  2.         /**
  3.          * @param args
  4.          */
  5.         public static void main(String[] args) {
  6.                 // TODO Auto-generated method stub
  7.                 Map tml=new TreeMap();
  8.                 tml.put("lisi", 18);
  9.                 tml.put("zhangsan", 14);
  10.                 tml.put("zhaoliu", 13);
  11.                 tml.put("wangwu", 17);
  12.                 tml.put("c", 17);
  13.                 tml.put("d", 17);
  14.                 tml.put("f", 17);
  15.                
  16.                 List l1=new ArrayList(tml.entrySet());
  17.                
  18.                 Collections.sort(l1, new Com());
  19.                
  20.                 Iterator it=l1.iterator();
  21.                 while(it.hasNext()){
  22.                         Map.Entry me=(Map.Entry)it.next();
  23.                         System.out.println(me.getKey() + "::" + me.getValue());
  24.                 }

  25.         }

  26. }

  27. public class Com implements Comparator {

  28.         @Override
  29.         public int compare(Object o1, Object o2) {
  30.                 // TODO Auto-generated method stub
  31.                 Map.Entry m1=(Map.Entry)o1;
  32.                 Map.Entry m2=(Map.Entry)o2;
  33.                
  34.                 return ((Integer) m1.getValue()).compareTo((Integer)m2.getValue());
  35.         }
  36.        

  37. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
treemap有(Comparator<? super K> comparator) 的构造方法在比较时取值,不容易取出value,所以不好比较。
把tree转成Map.Entry<K,V>对象,后该对象有getKey和getValue方法,这样就很方便取出值了,然后再实现自己的比较器,这样就可以了。
回复 使用道具 举报
给楼主提供一个思路 首先是取字母出现的次数,也就是应用到键值对的概念,但是他是分两部分实现的,一部分是比较,a 有几个啊 b 有几个, 比如a 是4个 b 是5个 然后用到代码
StringBuilder sb=new StringBuilder();
                Set<Map.Entry<Character,Integer>> entrySet=tm.entrySet();
                Iterator<Map.Entry<Character,Integer>> it=entrySet.iterator();
                while(it.hasNext())
                {
                        Map.Entry<Character,Integer> me=it.next();
                        Character ch=me.getKey();
                        Integer value=me.getValue();
                        sb.append(ch+" : "+value+"...");
                }
将 a 对应为 4 b对应为5 输入到map集合中,换句话说 假如a 代表的是 “zhagsan”  4代表的是 21 而b 代表的是"lisi" 5代表的是 23
比如 x.add("zhangsan",21);
       x.add("lisi",23);
你可以选择把zhangsan  lisi 传入到map集合中,然后map集合按照字母排列来排列,
那么你是否可以把他们传入到其他集合中呢?我当初是传入到了ArrayList 集合中,然后用数字做的比较
楼主按照这个思路想想呢,具体代码我就不打了  今天正好提交入学测试,怕被老师说透题 透代码哈

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
3楼你的意思是把你的意思是把键传入到ArrayList中吗??是一种思路,我试试吧!
回复 使用道具 举报
貌似是考题,还是自己答吧,给你答案了 也就没啥用了
回复 使用道具 举报
考题???   酷!
回复 使用道具 举报
我写出来了  谢谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马