Java StringTokenizer, empty null tokens

19,375

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;`  
 }
Share:
19,375
user69514
Author by

user69514

Updated on June 07, 2022

Comments

  • user69514
    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
    user69514 about 14 years
    I was checking things wrong. 29 actually works. -1 does too. Thansk
  • user69514
    user69514 about 14 years
    yeah I noticed that. I just check if the string is empty rather than null.
  • polygenelubricants
    polygenelubricants about 14 years
    @user69: use isEmpty() if Java6, use length() == 0 otherwise. Don't use equals("").