Java StringTokenizer, пустые нулевые токены

Я пытаюсь разбить строку на 29 токенов..... stringtokenizer не будет возвращать нулевые токены. Я попробовал string.split, но я считаю, что делаю что-то неправильно:

String [] strings = line.split(",", 29);

выборки:

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

Если вы хотите сохранить завершающие пустые строки, но вы не хотите давать магическое число для максимума, используйте отрицательный предел:

line.split(",", -1)

Если line.equals("a,,c"), то line.split(",", -1)[1].isEmpty(); это не null. Это связано с тем, что когда "," является разделителем, тогда ",," имеет пустую строку между двумя разделителями, а не null.


Пример:

Используя приведенное выше объяснение, рассмотрим следующий пример: ",,"

Хотя вы можете ожидать ",", null и ",".

Фактический результат: ",", "" и ","


Если вы хотите null вместо пустых строк в массиве, возвращаемом split, вам придется вручную сканировать массив и заменить их на null. Я не уверен, почему s == null лучше, чем s.isEmpty().

См. также

Ответ 3

Если вы хотите, чтобы пустые токены сохранялись, string.split не будет работать удовлетворительно. StringTokenizer также не будет работать. Я пришел со следующим методом, который может быть вам полезен

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

Если вы хотите, чтобы пустые токены сохранялись, string.split() не будет работать удовлетворительно. StringTokenizer также не будет работать. Я пришел со следующим методом, который может быть вам полезен:

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);

Этот класс предоставляет некоторые простые функции, обеспечивающие простые в использовании методы для преобразования между строками с разделителями, такими как строки CSV, а также коллекции и массивы.