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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

同样的实现不一样的写法.....我困惑了

import java.util.*;
class TreeMapTest
{
        public static void main(String[] args)
        {
                String s = "aafsdl,gdslkj/ssjf";
                charCount(s);
               
               
               
        }
        public static String charCount(String str)
        {
                char[] chs = str.toCharArray();
               
                int count = 0;
                TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();
                for (int x=0;x<chs.length; x++)
                {        //字符串中可能出现其他字符,所以这里我们要判断一下
                        if(chs[x]>='a'&&chs[x]<='z'||chs[x]>='A'&&chs[x]<='Z')
                        {        /*
                                Integer Value = tm.get(chs[x]);
                                if(!(Value==null))//if(Value!==null)这两句我觉得是相同的意思,但是却有着不一样的效果?                                        count = Value;
                                count++;
                                tm.put(chs[x],count);
                                */
                                Integer Value = tm.get(chs[x]);
                                if(Value == null)
                                        tm.put(chs[x],1);
                                else
                                {
                                        Value+=1;
                                        tm.put(chs[x],Value);
                                }
                        }
                        //else不加这个运行也正常,加else有什么意义?                                //continue;
                       
                }
                //System.out.println(tm);
                //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 in = me.getValue();
                        System.out.print(ch.toString()+"("+in.toString()+")");
                }

                return null;

        }
}
高手帮我分析下我这样写的弊端:(

7 个回复

倒序浏览
汗....加个红色字体把代码挤歪了...
回复 使用道具 举报
1.
if(!(Value==null))与if(Value!==null) //不等于应该是"!=",而不是"!=="
2.
else
    continue;  //这边加不加确实是一样的,因为已经是for循环最后了,后面没有其他代码了
3.
没明白意思,...-_-
回复 使用道具 举报
刘基军 发表于 2012-4-25 10:41
1.
if(!(Value==null))与if(Value!==null) //不等于应该是"!=",而不是"!=="
2.

                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 in = me.getValue();
                        sb.append(ch+"("+in+")");
                        //System.out.print(ch.toString()+"("+in.toString()+")");
                }
                return sb.toString();


我的意思是定义一个容器 然后添加数据return sb.toString();

和直接System.out.print(ch.toString()+"("+in.toString()+")");
然后在return null哪个好点?
回复 使用道具 举报
常万 发表于 2012-4-25 17:50
StringBuilder sb = new StringBuilder();
                Set entrySet = tm.entrySet ...

我认为方法返回字符串给调用者,让其自己对返回值操作比较合适一点.
回复 使用道具 举报
1、if(!(Value==null))是判断Value是否为空,之后取反,最终条件判断的是Value不等于空则执行if后的语句
   if(Value!=null),直接判断Value是否为非空,最终条件执行要求和上面是一样的。
   感觉上好像是下面一个少运算一步,电脑应该是不在乎这么点性能了,不过对于人类,我是觉得下面的一种更简洁点,上面的那个就是跟自己过不去,画蛇添足的,给自己增加逻辑难度。
2、esle确实没什么用,如果是你自己的代码的话那就可以删了,如果是别人代码的话,也许是别人预留用来以后扩展代码的位置;也可能是人家的书写习惯,或者是人家写代码的软件自动添加的。
3、可以返回StringBuilder对象共调用者对数据进行处理,也可以直接在函数里将数据处理掉,不提供返回值。这完全取决于你对函数的需求,以及你的调用函数是否对返回值有处理需求,如果没有处理需求的话尽量不要返回,这好像在软件工程里有个词叫减少“耦合度”什么的。

总之
1、代码的原则就是尽量简单易读,有个很厉害的人说过“如果对一个问题有两种解决方式,那简单的那个就是正确的方式”。
2、扩展性很重要,不过哪里要留。。看个人能力,像我的话就一般不留了,因为能力不足,完全不会预判,都是现用现加。。。。
3、是否要提供返回值,这完全取决于你的数据是否需要调用者去处理,尽量把事情在函数里做掉,做不完的再把值返回调用者处理。
回复 使用道具 举报
常万 中级黑马 2012-4-25 19:19:14
7#
丁佼 发表于 2012-4-25 18:21
1、if(!(Value==null))是判断Value是否为空,之后取反,最终条件判断的是Value不等于空则执行if后的语句
   ...

分析的很有道理..感谢~~其实那个esle是写在前面判断字符串中可能出现其它不需要的字符,我觉得把if(!(chs[x]>='a'&&chs[x]<='z'||chs[x]>='A'&&chs[x]<='Z'))
然后在return continue没有必要。不如直接判断字符是否在字符串中存在。就不知道加一个continue和不加有什么区别
回复 使用道具 举报
1.两个不要的,“!=”
2.如果单个字符过多的话,每次都要执行下面的代码,浪费时间
3.一般来说,加sb就是用空间换时间
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马