Подтвердить что ты не робот

Java разделяется последовательным символом

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

String text = "a,b,,,,c,,";
String[] split = text.split(",");
for(int i=0;i<split.length;i++){
    System.out.println("I = "+i+" "+split[i]);
}

Вывод:

I = 0 a

I = 1 b

I = 2 

I = 3 

I = 4 

I = 5 c

Но я хочу получить массив размером 8, содержащий также:

I = 6 

I = 7

Конечно, последние 2 элемента будут пустыми строками, но для меня важно получить их. Кроме того, я думаю, что логично их иметь. Я имею в виду, если бы у меня было:

String text = "a,b,,,,c,,d";

Результатом будет массив размером 8, и я не думаю, что существует большая разница между двумя примерами.

4b9b3361

Ответ 1

String[] split = text.split(",", -1);

Такое поведение на самом деле выглядит сложным, но на самом деле это объясняется (не очень хорошо, IMHO, это сказано) в официальной документации .

Если n не положительно, то шаблон будет применяться столько раз, сколько возможно, и массив может иметь любую длину

Проблема с text.split(",") заключается в том, что она эквивалентна text.split(",", 0). Использование предела 0, как описано в документации:

Если n равно нулю, шаблон будет применяться столько раз, сколько возможно, массив может иметь любую длину, а завершать пустые строки будет отброшена.

Вы определенно не хотите, чтобы пустые строки были отброшены.

Ответ 2

Я предпочитаю (если вы можете использовать внешние библиотеки):

String[] split = StringUtils.splitPreserveAllTokens(text, ',');

По большей части библиотека StringUtils имеет тенденцию быть чуть более эффективной, чем реализация java по умолчанию, потому что... ну, эй, почему Apache потрудился написать ее. Кроме того, на первый взгляд, это ясно, что этот раскол делает из имени метода, тогда как на первый взгляд регулярная строка, разделенная с пределом -1, может и не быть.