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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. <font size="4" face="simsun">/*
  2. 问题:统计字符串中各个字符出现的次数
  3. 按照正常的思路,写出了如下代码:
  4. */
  5. char[] chs = str.toCharArray();
  6. Map<Character,Integer> map = new TreeMap<Character,Integer>();
  7. for(int i=0;i<chs.length;i++){
  8.     Integer value = map.get(chs[i]);
  9.     if(value == null){
  10.         //如果不存在,就put次数1进去
  11.         map.put(chs[i], 1);
  12.     }else{
  13.         //如果存在,次数++
  14.         map.put(chs[i], value + 1);
  15.     }
  16. }
  17. /*
  18. 当我看完毕老师的关于这个问题的视频后,我便开始思考了。
  19. 优化:既然是每次都会put,那我就写一句put在最后便是;
  20.           1、如果map.get(chs[i])为null,
  21.              那我就简单的认为这个字符次数为0(其实null和0是不同的)
  22.                  然后给value赋值为0;
  23.           2、不为null,put的时候次数++就好了;
  24.           3、最后一句便是put语句。
  25. 优化后的代码如下:
  26. */
  27. //直接for循环了
  28. for(int i=0;i<chs.length;i++){
  29.       Integer value = map.get(chs[i]);
  30.       if(value == null)
  31.           value = 0;
  32.       map.put(chs[i], value + 1);
  33. }
  34. /*
  35.         说好的思考,总结:算法之道的从无到有的思想!
  36. */</font>
复制代码
鄙人昨晚睡觉前的思考,今日做个总结。
若看官有什么想法,请多多指点!

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

8 个回复

倒序浏览
  1. for(int i=0;i<chs.length;i++){

  2.     Integer value = map.get(chs[i]);
  3. map.put(chs[i], ((value ==null)?0:value)+ 1);

  4. }
复制代码
不知道楼主看得懂么?:lol

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报 1 0
yanzhendong 发表于 2014-4-3 19:35
不知道楼主看得懂么?

三目运算,也还行,虽说缩短了代码一点,不过效率上if -else语句略胜一筹。anyway,thanks
回复 使用道具 举报
yanzhendong 发表于 2014-4-3 19:35
不知道楼主看得懂么?

或许可以这样:直接put——( (value ==null) ? 1 : value+1 )
您说呢?
回复 使用道具 举报
小斥候 发表于 2014-4-3 21:58
或许可以这样:直接put——( (value ==null) ? 1 : value+1 )
您说呢?

有意思么?还有,你说ifelse效率比三目高,你怎么知道?你试过?
回复 使用道具 举报
  1. package com.blog;

  2. public class blog9{
  3.         public static void main(String[]args) throws Exception{
  4.      ifelse();
  5.      shanmu();
  6.         }
  7.         static void ifelse(){
  8.        long starttime=System.currentTimeMillis();
  9.        long endtime;
  10.        int count=1000000000;
  11.        int test;
  12.        while ((count--)>0){
  13.                test =(count==0)?123:336;
  14.        }
  15.        endtime=System.currentTimeMillis();
  16.        System.out.println("ifelse:"+(endtime-starttime));
  17.         }
  18.         static void shanmu(){
  19.             long starttime=System.currentTimeMillis();
  20.                long endtime;
  21.                int count=1000000000;
  22.                int test;
  23.                while ((count--)>0){
  24.                        if(count==0){
  25.                                test=123;
  26.                        }else{
  27.                                 test=336;
  28.                        }
  29.                }
  30.                endtime=System.currentTimeMillis();
  31.                System.out.println("shanmu:"+(endtime-starttime));
  32.                
  33.         }
  34.        
  35. }
复制代码
这是测试代码,结果是ifelse:604
shanmu:602
可以看到,运行十亿次ifelse的时间和运行十亿次三目运算的时间基本相同
回复 使用道具 举报
yanzhendong 发表于 2014-4-3 22:33
这是测试代码,结果是ifelse:604
shanmu:602
可以看到,运行十亿次ifelse的时间和运行十亿次三目运算的时间 ...

不好意思,我给记反了。先前看过一篇文章探究两个的区别。
你这一说让我想起来了,谢了
回复 使用道具 举报
小斥候 发表于 2014-4-4 23:15
不好意思,我给记反了。先前看过一篇文章探究两个的区别。
你这一说让我想起来了,谢了 ...

额,如果判断条件是两个对象的话,ifelse比三目运算快百分之五,如果是基本数据类型,他们效率一样
回复 使用道具 举报
yanzhendong 发表于 2014-4-4 23:48
额,如果判断条件是两个对象的话,ifelse比三目运算快百分之五,如果是基本数据类型,他们效率一样 ...

恩,大数据的话,是有些差别的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马