Java StringTokenizer, empty null tokens
Solution 1
If you want the trailing empty strings to be kept, but you don't want to give a magic number for maximum, use a negative limit:
line.split(",", -1)
If line.equals("a,,c")
, then line.split(",", -1)[1].isEmpty()
; it's not null
. This is because when ","
is the delimiter, then ",,"
has an empty string between the two delimiters, not null
.
Example:
Using the explanation above, consider the following example: ",,"
Although you might expect ","
, null
, and ","
.
The actual result is ","
, ""
and ","
If you want
null
instead of empty strings in the array returned by split
, then you'd have to manually scan the array and replace them with null
. I'm not sure why s == null
is better than s.isEmpty()
, though.
See also
Solution 2
Use StringUtils.splitPreserveAllTokens()
in Apache Commons Lang library
Solution 3
If you want empty tokens to be retained string.split
won't work satisfactorily. StringTokenizer
will also no work.
I have come with following method, which might be helpful for you
public static String[] splitTotokens(String line, String delim){
String s = line;
int i = 0;
while (s.contains(delim)) {
s = s.substring(s.indexOf(delim) + delim.length());
i++;
}
String token = null;
String remainder = null;
String[] tokens = new String[i];
for (int j = 0; j < i; j++) {
token = line.substring(0, line.indexOf(delim));
//System.out.print("#" + token + "#");
tokens[j] = token;
remainder = line.substring(line.indexOf(delim) + delim.length());
//System.out.println("#" + remainder + "#");
line = remainder;
}
return tokens;`
}
user69514
Updated on June 07, 2022Comments
-
user69514 almost 2 years
I am trying to split a string into 29 tokens..... stringtokenizer won't return null tokens. I tried string.split, but I believe I am doing something wrong:
String [] strings = line.split(",", 29);
sample inputs:
10150,15:58,23:58,16:00,00:00,15:55,23:55,15:58,00:01,16:03,23:58,,,,,16:00,23:22,15:54,00:03,15:59,23:56,16:05,23:59,15:55,00:01,,,, 10155,,,,,,,,,,,07:30,13:27,07:25,13:45,,,,,,,,,,,07:13,14:37,08:01,15:23 10160,10:00,16:02,09:55,16:03,10:06,15:58,09:48,16:07,09:55,16:00,,,,,09:49,15:38,10:02,16:04,10:00,16:00,09:58,16:01,09:57,15:58,,,,
-
user69514 about 14 yearsI was checking things wrong. 29 actually works. -1 does too. Thansk
-
user69514 about 14 yearsyeah I noticed that. I just check if the string is empty rather than null.
-
polygenelubricants about 14 years@user69: use
isEmpty()
if Java6, uselength() == 0
otherwise. Don't useequals("")
.