Java - Use String split method to include empty value

之前在無意中注意到字串的切割預設會將符號與符號間若是empty value,會自動省略該筆資料

,也就是說預計長度是n,最後卻是n-1。

以例子來說,假設我定義了一個class,成員變數key為其他成員變數ID、Name、Interest的組合

即 key = "A123::Ben::Baseball",當我split key時,正常會得到lenth = 3,但假設這個key interest是

空的,那麼split回傳回來的string array長度會得到2,也就是此array[2]不存在!當要讀取時會有

問題!

因此,若您要保留這筆empty value,需要使用split method帶進第二個參數

基本定義如:

public String[] split(String regex, int limit)

一、limit < 0

根據原始碼的split過程,假設要無條件的去得到含empty value的array,

可帶進小於0的value給limit

假設String sp_key[] = key.split("::", -1);

此時,就算key = "A123::Ben::",也會得到sp_key length = 3,sp_key[2] = ""

二、limit > 0

若limit > 0 ,即表示您切割後回傳想得到的資料筆數(若超過可切割的大小,即以最大的容

許值為主)

假設String sp_key[] = key.split("::", 2);

此時,key = "A123::Ben::",會得到sp_key length = 2

sp_key[0] = "A123";sp_key[1] = "Ben"

若String sp_key[] = key.split("::", 3);

則sp_key[2] = ""也會存在!

三、limit = 0

即一般的split用法(單一帶入regex的value),預設帶進來的即為0

總結:

根據原始碼的操作,limit = 0 與 limit < 0 都會切割得到所有的values(include empty value)

差別只在於若limit = 0 ,最後程式會再做一次construct的動作,相關片段程式如下:

int resultSize = list.size();
if (limit == 0)
   while (resultSize > 0 && list.get(resultSize - 1).length() == 0)
      resultSize--;
String[] result = new String[resultSize];

# list裡面包含前面切割得到的資料

留言