熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java的二個字符串處理方法

2013-11-23 19:34:40  來源: Java核心技術 

  以下是測試程序運行結果

  source = a b c d e f g h i j k l m n o p q r s t u v w x y z

  字符串中刪除字符的方法

  系統函數計算 次用時 ms

  自定義方法計算 次用時 ms

  生成 abcdefghijklmnopqrstuvwxyz

  

  字符串按字符分割的方法

  系統函數計算 次用時 ms

  自定義方法計算 次用時 ms

  生成 [LjavalangString;@: [a b c d e f g h i j k l m n o p q r s t u v w x y z]

  

  能夠數倍超越爪哇(Java)類庫(Java和Java)中相關方法的性能究其原因是因為類庫為通用性提供的相關方法都采取了正則表達式參數雖然編譯過的正則表達式很高效但畢竟無法和字符相等這種單拍操作相提並論

  下面把程序發出來供大家指出錯誤討論以及參考

  首先是刪除字符串中某字符的方法

  /**

   * <b>字符串刪除其中某字符</b><br/>

   * 本方法用來移除指定字符串中的指定字符

   * 在 Java 以內刪除字符串中的指定字符需要通過

   * {@link String#replace(CharSequence CharSequence) replace} 方法將指定單

   * 字符的字符串替換成空字符串來實現而 <code>replace</code> 方法為了追求通用

   * 使用了正則表達式參數即便是編譯過的正則表達式其性能也無法與簡單的字符相等

   * 判斷相提並論<br/>

   * 本方法不涉及正則表達式通過遍歷原字符串對應的字符數組來尋找符合待刪除字符的

   * 字符然後通過 {@link StringBuilder} 來追加其余字符這是一個簡單但高效的方法

   * <br/>

   * 本方法編寫之初曾試圖通過 <code>StringBuilder</code> 的功能來直接刪除字符串

   * 中待刪除字符後經 網站用戶 shenyuc 提示並經過考證發現

   * {@link StringBuilder#deleteCharAt(int) deleteCharAt} 方法並不高效應該是

   * 因為其內部每次刪除都進行了數組遷移遂改為追加方式效率提高了 倍多<br/>>>

   * 本方法使用示例如下

   * <pre>

   * String source = a b c d e f g h i j k l m n o p q r s t u v w x y z;

   * String removed = StringToolremoveChar(source );</pre>

   * 此示例中{@link String} source 為原字符串String removed 為刪除空格後的

   * 結果

   * @see     String#replace(CharSequence CharSequence)

   * @see     StringBuilder#append(char)

   * @param   source  待被處理的字符串即本方法的原字符串

   * @param   target  需要從原字符串中移除的字符

   * @return      從指定原字符串中移除指定字符後所得的結果字符串

   * @exception   NullPointerException    當傳入參數 source 為空時

   */

  static public String removeChar(String source char target)

  {

      StringBuilder builder = new StringBuilder();

      for (char c: sourcetoCharArray())

          if (c != target) builderappend(c);

      return buildertoString();

  }

  接下來是字符串分割的方法

  /**

   * <b>簡易字符串分割</b><br/>

   * 本方法用來根據指定字符將某字符串以此為分割拆分成多個子字符串

   * 對於分割字符串功能在 Java 以內都只提供了支持正則表達式的

   * {@link String#split(String) split} 方法此方法為追求通用即便是簡單的

   * 分割也會基於正則表達式來進行即便是編譯過的正則表達式其性能也無法與簡單

   * 的字符相等判斷相提並論<br/>

   * 本方法不涉及正則表達式通過遍歷原字符串對應的字符數組來尋找符合分割字符的

   * 字符然後通過 {@link String#substring(int int)} 來獲取每一個分割字符之間

   * 的子字符串存入一個 {@link LinkedList} 中這是一個功能簡單但高效的方法

   * 如果規模比較大擬考慮先通過一次循環取得原字符串中分割字符的數量以此制作

   * 定長的 {@link ArrayList}

   * 本方法尤其適用於常見的由半角逗號結合在一起的字符串的分割<br/>

   * 在編寫之初本方法曾采取將字符串的字符數組分段處理通過系統字符串復制來形成

   * 一個個子字符串後經考證{@link String#substring(int int)} 是一個很高效的

   * 方法遂改效率提高了一倍

   * 本方法使用示例如下

   * <pre>

   * String source = a b c d e f g h i j k l m n o p q r s t u v w x y z;

   * List<String> secs = StringToolsplitSimpleString(source );</pre>

   * 此示例中{@link String} source 為原字符串{@link List} secs 為刪除空格後

   * 的結果

   * @see     String#split(String)

   * @see     String#substring(int int)

   * @param   source  待被處理的字符串即本方法的原字符串

   * @param   gap     分割字符

   * @return      從指定原字符按分割字符拆分成的子字符串列表

   * @exception   NullPointerException    當傳入參數 source 為空時

   */

  static public List<String> splitSimpleString(String source char gap)

  {

      List<String> result = new LinkedList<String>();

      char[] sourceChars = sourcetoCharArray();

      String section = null;

      int startIndex = ;

      for (int index = ; ++index != sourceCharslength; )

      {

          if (sourceChars[index] != gap) continue;

          section = sourcesubstring(startIndex index);

          resultadd(section);

          startIndex = index + ;

      }

      section = sourcesubstring(startIndex sourceCharslength);

      resultadd(section);

      return result;

  }

  最後是測試程序

  static public void main(String[] arguments)

  {

      // 准備測試內容

      String source = a b c d e f g h i j k l m n o p q r s t u v w x y z;

      Systemoutprintln(source = + source);

      int loop = ;

      String resultString = null;

      List<String> resultList = null;

      String[] resultArr = null;

      int index = ;

  

      long start = CalendargetInstance()getTimeInMillis();

      Systemoutprintln(字符串中刪除字符的方法);

  

      // 測試 Java 類庫提供的字符串刪除某字符

      index = ;

      while (++index != loop)

          resultString = sourcereplace( );

      long end = CalendargetInstance()getTimeInMillis();

      Systemoutprintln(系統函數計算 + loop + 次用時 + (end start) + ms);

  

      // 測試自定義的字符串刪除某字符

      index = ;

      while (++index != loop)

          resultString = StringToolremoveChar(source );

      long end = CalendargetInstance()getTimeInMillis();

      Systemoutprintln(自定義方法計算 + loop + 次用時 + (end end) + ms);

  

      Systemoutprintln(生成 + resultString + );

      Systemoutprintln( \n);

  

      // 測試 Java 類庫提供的字符串按某字符分割

      Systemoutprintln(字符串按字符分割的方法);

      index = ;

      while (++index != loop) resultArr = sourcesplit( );

      long end = CalendargetInstance()getTimeInMillis();

      Systemoutprintln(系統函數計算 + loop + 次用時 + (end end) + ms);

  

      // 測試自定義的字符串按某字符分割

      index = ;

      while (++index != loop)

          resultList = StringToolsplitSimpleString(source );

      long end = CalendargetInstance()getTimeInMillis();

      Systemoutprintln(自定義方法計算 + loop + 次用時 + (end end) + ms);

  

      Systemoutprintln(生成 + resultArr + : + resultList + );

      Systemoutprintln( \n);

  }


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27117.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.