日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Split in Java

發布時間:2025/3/21 java 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Split in Java 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在 Java 中處理字符串時,split 是一個很常用的操作,但是這一簡單的操作,卻經常有意想不到的結果,就拿Guava庫官方教程中的一個例子來說,",a,,b,".split(",") 的結果是?

1. "", "a", "", "b", "" 2. null, "a", null, "b", null 3. "a", null, "b" 4. "a", "b" 5. None of the above

正確答案應該是 5,以上都不對;正確結果是 ["", "a", "", "b"]。

正是因為 JDK 自帶的 split 這種奇怪的現象,其他開源庫也都給出了自己的 split 方法,如 Apache Commons Lang 和上文中的 Guava 。

split in JDK8

String 類包含兩個 split 重載方法,public String[] split(String regex) 和 public String[] split(String regex, int limit),調用前者就相當于默認 limit = 0,而上面的例子中奇怪的現象就和這個 limit 有關。

JDK 文檔中是這么解釋的:

  • 當 limit 即 n 大于 0 時,會返回至多 n 項,最后一項會包含所有未被拆分的部分

  • 當 n 小于 0 時,會返回所有拆分后的結果

  • 當 n 等于 0 時,會返回所有拆分后的結果,但是最后跟著的空字符串會被刪除

  • 由于使用了單參數的 split 方法,n == 0,于是就產生了如上的結果。關于這一部分的 JDK 中的源碼部分如下:

    // Construct result int resultSize = list.size(); if (limit == 0) {while (resultSize > 0 && list.get(resultSize - 1).length() == 0) {resultSize--;} }

    平常在分析一些具有固定格式的數據時,比如每一行都是 tab 分割的,且有固定列數,那么進行解析時可以使用 s.split("\t", -1) 來進行操作。這樣會保存所有的分割項,包含任意部位的空字符串,比如

    ":a::b::".split(":", -1) => ["", "a", "", "b", "", ""]

    另外一個需要注意的地方是,split 接收的參數是一個正則表達式,這一點經常容易忽略。比如 "a.b.c".split(".") 的結果是 [],長度為 0 ,因為首先 . 匹配任意字符,所以原字符串中每一個都是分割符,這就產生了 6 個空字符串, 然后 limit 默認為 0 ,從后往前刪除空字符串,結果就為空。

    split in Commons Lang

    JDK 中的方法畢竟還是簡單了一些,不能滿足我們一些特殊需求,或者說不想使用正則,那么可以使用 Commons Lang 庫中的方法。這些 split 方法有以下特點:

  • 如果沒有指定結果個數,都默認輸出最多項

  • 如果沒有 PreserveAllTokens 后綴,默認將多個連續分割符視為 1 個,不保留任意位置空字符串

  • 比如:

    StringUtils.split("::a::b::", ":") => ["a", "b"]

    需要注意的是 split(String str, String separatorChars) 方法中第二個參數的意義是每一個字符都被當成分割符,比如:

    StringUtils.split(":a:b:", "ab") => [":", ":", ":"]

    那么假如我想用 "ab" 整體作為分割符呢,可以使用 splitByWholeSeparator 方法:

    StringUtils.splitByWholeSeparator("abcabc","ab") => ["c", "c"]

    但這個方法有一個和其他方法表現不一致的地方,它保留了末尾的空字符串,且只保留一個。

    StringUtils.splitByWholeSeparator("abb", "bb") => ["a", ""] StringUtils.splitByWholeSeparator("bba", "bb") => ["a"] StringUtils.splitByWholeSeparator("abbbbabbbb", "bb") =>["a", "a", ""]

    另外一個我覺得很有用的就是一系列 splitPreserveAllTokens 重載函數了,因為默認輸出所有結果,且保留了空字符串。和 JDK 中的 limit = -1 結果一致,但更易讀一些。

    split in Guava

    假如你已經被上面這些特殊情況都繞暈了,不妨試試 Guava 庫,它沒有提供簡單的一系列重載 split 方法,而是提供了一系列的工廠方法,采用鏈式調用,從而從方法名上就能看出結果,不用苦思冥想到底有沒有陷阱。

    Splitter.on(",").trimResults(CharMatcher.is(',')).omitEmptyStrings().limit(2).split("a,,,,,b,,,,c,,,")=> ["a", "b,,,,c"]

    除了按照分割符外,還可以按照長度:

    Splitter.fixedLength(3).split("abcde") => ["abc", "de"]

    不像 JDK 和 Commons Lang 中的返回數組,Guava 返回 Iterable 和 List,而且這個 Iterable 已經重載了 toString,可以方便地進行打印測試。

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的Split in Java的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。