Как разделить строку, содержащую только разделитель? - PullRequest
15 голосов
/ 24 апреля 2009

Я использую следующий код:

String sample = "::";
String[] splitTime = sample.split(":");
// extra detail omitted
System.out.println("Value 1 :"+splitTime[0]);
System.out.println("Value 2 :"+splitTime[1]);
System.out.println("Value 3 :"+splitTime[2]);

Я получаю ArrayIndexOutofBound исключение. Как String.split() обрабатывает последовательные или конечные / открывающие разделители?

См. Также :

Ответы [ 5 ]

24 голосов
/ 24 апреля 2009

Alnitak правильно, что завершающие пустые строки будут отброшены по умолчанию.

Если вы хотите иметь завершающие пустые строки, вы должны использовать split(String, int) и передавать отрицательное число в качестве параметра limit.

Параметр limit определяет количество раз, которое шаблон применяется и, следовательно, влияет на длину результирующего массив. Если предел n больше нуля, то шаблон будет применяться максимум n - 1 раз, массив длина будет не более n , а последняя запись массива будет содержать все входные данные за последним согласованным разделителем. Если n не является положительным, то шаблон будет применяться столько раз, сколько возможно, и массив может иметь любую длину. Если n равен нулю, шаблон будет применяться столько раз, сколько возможно, массив может имеют любую длину, а завершающие пустые строки будут отброшены.

Обратите внимание, что split(aString) является синонимом split(aString, 0):

Этот метод работает так, как если бы он вызывал метод с двумя аргументами split с заданным выражением и предельным аргументом, равным нулю. Поэтому завершающие пустые строки не включаются в результирующий массив.

Кроме того, вы должны использовать цикл для получения значений из массива; это позволяет избежать возможных ArrayIndexOutOfBoundsException.

Таким образом, ваш исправленный код должен быть (при условии, что вы хотите завершающие пустые строки):

String sample = "::";
String[] splitTime = sample.split(":", -1);
for (int i = 0; i < splitTime.length; i++) {
    System.out.println("Value " + i + " : \"" + splitTime[i] + "\"");
}

Выход:

Value 0 : ""
Value 1 : ""
Value 2 : ""
4 голосов
/ 24 апреля 2009

Из руководства J2SE API :

Поэтому завершающие пустые строки не включаются в результирующий массив.

Итак, если вы введете "::", вы получите пустой массив, потому что все разделители завершаются.

Если вы хотите убедиться, что вы получаете не более , чем три записи, которые вы должны использовать:

String[] splitTime = sample.split(":", 3);

С вводом "::", который действительно даст вам три пустых строки в выходном массиве.

Однако, если во входных данных есть только один «:», то в массиве вы все равно получите только два элемента.

1 голос
/ 24 апреля 2009

Как это возможно?

int ndx = 0;
StringTokenizer t = new StringTokenizer(": : ::::",":");
while (t.hasMoreElements())
{
    System.out.println(String.format("Value %d : %s", ++ndx,t.nextElement()));
}
0 голосов
/ 24 апреля 2009

вы должны проверить длину массива splitTime.

0 голосов
/ 24 апреля 2009

Используйте функцию StringTokenizer, в которой вы передаете строку и второй аргумент в качестве разделителя

используйте функцию splittime.length, чтобы найти длину

...