Java StringTokenizer, empty null tokens

别等时光非礼了梦想. 提交于 2019-12-18 20:48:52

问题


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,,,,

回答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

  • Java String.indexOf and empty strings



回答2:


Use StringUtils.splitPreserveAllTokens() in Apache Commons Lang library




回答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;`  
 }



回答4:


If you want empty tokens to be retained string.split() won't work satisfactorily. StringTokenizer will also not 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;
}



回答5:


use this org.springframework.util.StringUtils

org.springframework.util.StringUtils.delimitedListToStringArray(data, delimit);

This class delivers some simple functionality provides easy-to-use methods to convert between delimited strings, such as CSV strings, and collections and arrays.



来源:https://stackoverflow.com/questions/2708591/java-stringtokenizer-empty-null-tokens

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!