`

项目小经验: 杀鸡用了牛刀

阅读更多

    有这么一个小事: DB表里的一个字段存着类似这样的数据">=100",">25","=123",现在要求在Java取出后把那些比较运算符后的数字取出来,比如说">=100"取出"100"来, ">123"取出"123"来.

    简单想了想,觉得用subString有些麻烦, 还得借助indexOf去得到比较运算符的位置,这样也就意味着另写一个方法,这个方法直接放在model类里很ugly放到commonUtil里吧还得再把那个文件也检出... 麻烦!(这时想到了apache的StringUtils啊,不过由于是急活也没埋时间去看StringUtils下的方法), 转念想到了split方法.于是有了如下实现:

    public String getRealValue(){
          if(descText == null){
              return "";
          }
          if(descText.startsWith(">=")){
              return descText.split(">=")[1];
          }else if(descText.startsWith(">")){
              return descText.split(">")[1];
          }else if(descText.startsWith("=")){
              return descText.split("=")[1];
          }else{
              return "";
          }
    }

   现在手头没什么急活了, 就回过头来再看看这个问题. 这次从apache的StringUtils看起.

     从API里看到如下的方法: IsEmpty, IndexOf, Substring等方法, 接下来看到的substringAfter方法吸引了我的注意,这不正好符合我的问题嘛.

 再看它的源码:

  public static String substringAfter(String str, String separator) {
        if (isEmpty(str)) {
            return str;
        }
        if (separator == null) {
            return EMPTY;
        }
        int pos = str.indexOf(separator);
        if (pos == -1) {
            return EMPTY;
        }
        return str.substring(pos + separator.length());
    }
用的方法也就是先通过indexOf再以subString来取得最终结果.

这个方法里为什么没像我那样用split呢? 用split有什么不好?带着这种疑问我看了String中split方法的实现:

  public String[] split(String regex, int limit) {
        return Pattern.compile(regex).split(this, limit);
  }

My God! 差老多了, 这不是杀鸡用了牛刀!

从代码量来看:new Pattern(compile方法里调用)里有15行的实现,split方法里又有35行的实现. 这时感觉到了代码行数也是对一个算法高效与否的粗略判断.

 再往下追, compile方法里有new Pattern(regex, 0);

 而在split里又有ArrayList matchList = new ArrayList();

我们知道new一个新的对象JVM是做不少额外开销的. 而反看substringAfter里用到的两个方法indexOf和substring,全都是char数组的操作.

这样一比较发现, split与substringAfter在算法复杂度上的差别要比用牛刀来杀鸡夸张多了.

2
0
分享到:
评论
2 楼 rmn190 2008-12-13  
现在数据库里存的数据也就只有三种情况: >=,>,=.

这个穷举与否所涉及的问题不是很严重,也就用这种笨方法了.

想到过抽象类再分类实现.
1 楼 hifun 2008-12-13  
    public String getRealValue(){
          if(descText == null){
              return "";
          }
          if(descText.startsWith(">=")){
              return descText.split(">=")[1];
          }else if(descText.startsWith(">")){
              return descText.split(">")[1];
          }else if(descText.startsWith("=")){
              return descText.split("=")[1];
          }else{
              return "";
          }
    }


就没了?
<  <=  <> ...... 只能穷举?

相关推荐

    下载你就赚到了npoi

    只是感觉它的功能过于强大,如果不是用在大项目上有点杀鸡用牛刀的感觉。 于是就想找个替代品,然后就发现了NPOI。下载类库来使用了一下,生成Excel的速度还是挺快的。去了解了下这个类库,它是POI项目的.NET 版本...

    Dapper源码 (最新)

    Dapper是一款轻量级ORM工具(Github)。如果你在小的项目中,使用Entity Framework、NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用牛刀。你又觉得ORM省时省力,这时Dapper 将是你不二的选择。

    Dapper for net

    Dapper是一款轻量级ORM工具(Github)。如果你在小的项目中,使用Entity Framework、NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用牛刀。你又觉得ORM省时省力,这时Dapper 将是你不二的选择。

    轻量级ORMDapper

    Dapper是一款轻量级ORM工具。如果你在小的项目中,使用Entity Framework、NHibernate来处理大数据访问及关系映射,未免有点杀鸡用牛刀。你又觉得ORM省时省力,这时Dapper将是你的不二选择。这里提供了Dapper源码。

    mysql 关键词相关度排序方法详细示例分析

    小项目有时需要用到关键词搜索相关性排序,用sphinx显得杀鸡用牛刀,就用mysql的order by对付下。方法一: 代码如下:select * from articles where (title LIKE ‘%keywords%’) or (content LIKE ‘%helloworld%’)...

    基于MVC架构的轻量开源社区系统 StartBBS.zip

    其实STB的由来很简单,以前一直用DZ/PW建论坛,在使用过程中发现他们的体积和逻辑关系太复杂了,光数据库里就有几十个关系表,对于做一个小网站来说,有点杀鸡用宰牛刀的感觉,并且备份也麻烦。所以就自己写了一个...

    nodejs的HTML分析利器node-jquery用法浅析

    分享给大家供大家参考,具体如下: ...由于采用简单的数据分析,只是Host一个简单的web Server,所以本人不喜欢Tomcat,IIS这类大型工具,显得有点杀鸡用牛刀,班门弄斧。我更喜欢node.js这类简易的we

    在C#中如何使用Dapper详解(译)

    如果你在小的项目中,使用Entity Framework、NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用牛刀。你又觉得ORM省时省力,这时Dapper 将是你不二的选择。 对象关系映射(ORM)已经被使用了很长时间,以解决...

    Vue组件通信之Bus的具体使用

    关于组件通信我相信小伙伴们肯定也都很熟悉,就不多说了,对组件通信还不熟悉的小...不过如果项目不是很大,状态管理也没有很复杂的话,使用 Vuex 有种杀鸡用牛刀的感觉,当然,这也是要根据自己的需求来的,只是建议

    二进制XML存储方案

    其次,使用RDB还有一个问题:数据的层次表达与多值问题,将树型数据扁平化存储的方案是有的,但是,将几层简单的节点拆分成N个表格,岂不是杀鸡用牛刀? 其次的考虑当然是XML,然而XML是基于可读文本的,如何解决二...

    从ESFramework抽离出来的通信库StriveEngine(C#)

    对于他们目前的项目来说有点“杀鸡用牛刀”的意思,因为他们的项目不需要文件传送、不需要P2P、不存在好友关系、也不存在组广播、不需要服务器均衡、不需要跨服务器通信、甚至都不需要使用UserID,只要客户端能与...

    Dapper从入门到精通

    在性能方面拥有微型ORM之王的美誉,几乎与原生ADO.NET数据读取器一样快,如果你在小的项目中使用Entity Framework、NHibernate等框架来处理大数据访问及关系映射,未免有点杀鸡用牛刀,你又觉得ORM省时省力,这时...

    ASP.NET中BulletedList列表控件使用及详解

    对于ASP.NET 1.x里要动态显示Bulledted List时,要么自己利用HTML的或元素构造,要么就是“杀鸡用牛刀”的动用Repeater来显示。前者过于死板,后者过于Overkill,也许微软听到这种声音,于是ASP.NET 2.0总算搞了个...

    Nginx安装包

    当时的想法是新建一张表来储存设置的时间,但总有杀鸡用牛刀的感觉。后来工头提醒项目已经有了redis,那就物尽其用,就被叫去做redis实现数据缓存功能。 好在redis提供了java客户端开发包,名曰jedis,下星期会比较...

    用ES6写全屏滚动插件的示例代码

    首先,最大的问题是最流行的几个插件都依赖 jQuery,这意味着在使用 React 或者 Vue 的项目中使用他们是一件十分蛋疼的事:我只需要一个全屏滚动功能,却还需要把 jQuery 引入,有种杀鸡使用宰牛刀的感觉;

    无限循环PageView列表

    UICollectionView 可以解决各种布局难题,但是稍显复杂,对于一些简单的需求,有点杀鸡用牛刀的感觉。 在 iOS6 以前,还没有 UICollectionView,为了实现横向滚动的 UITableView,只有自己动手写组件。为了达到和 ...

    软件设计规范

    可能软件构造本身是澄清问题的工作,明确“容量”的特点,为软件构造的选择提供准确的依据,杀鸡不要用牛刀。实际问题的“容量”很容易测量,因为它反映为应用的规模,流程的流量。(架构是什么?架构是否存在?如果...

Global site tag (gtag.js) - Google Analytics