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()
.
См. также
Ответ 2
Используйте StringUtils.splitPreserveAllTokens()
в Библиотека Apache Commons Lang
Ответ 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, а также коллекции и массивы.