Java StringTokenizer, пустые нулевые токены - PullRequest
10 голосов
/ 25 апреля 2010

Я пытаюсь разбить строку на 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,,,,

Ответы [ 5 ]

16 голосов
/ 25 апреля 2010

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

line.split(",", -1)

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


Пример:

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

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

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


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

Смотри также

5 голосов
/ 12 июля 2013

Использование StringUtils.splitPreserveAllTokens() в Apache Commons Lang библиотека

2 голосов
/ 14 февраля 2012

Если вы хотите, чтобы пустые токены были сохранены 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;`  
 }
0 голосов
/ 17 октября 2013
use this org.springframework.util.StringUtils

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

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

0 голосов
/ 14 февраля 2012

Если вы хотите сохранить пустые токены, 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;
}
...