2009-04-24 6 views
14

Я использую следующий код:Как можно разбить строку, содержащую только разделитель?

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() обрабатывать последовательные или конечные/открывающие разделители?

Смотрите также:

ответ

0

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

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

+0

Плохой совет. StringTokenizer будет рассматривать два двоеточия как один разделитель. В любом случае, StringTokenizer - это унаследованный класс; разработчикам рекомендуется использовать split(). –

+0

Об использовании splitTime.length: в этом примере длина всегда будет равна нулю. Все «токены» были бы нитями нулевой длины, а StringTokenizer никогда не выдавал пустые токены. –

4

От J2SE API manual:

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

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

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

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

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

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

+0

с использованием «::». Split (":") actualy возвращает пустой массив, а не массив из двух элементов. –

+0

действительно, вы правы - я отредактирую соответственно. – Alnitak

24

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

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

limit Параметр контролирует количество раз применяется структура и, следовательно, влияет на длину результирующего массива. Если предел п больше нуля, то образец будет применяться в большинстве н   -   1 раз, длина массива будет не больше, чем п, а последняя запись массива в будет содержать все ввод за пределы последнего согласованного разделителя. Если 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 : "" 
+0

Хорошая точка в пределе -ve, но по-прежнему требует, чтобы границы массива были проверены в случае, если на входе было только одно: «. – Alnitak

+0

Point принят. –

1

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

int ndx = 0; 
StringTokenizer t = new StringTokenizer(": : ::::",":"); 
while (t.hasMoreElements()) 
{ 
    System.out.println(String.format("Value %d : %s", ++ndx,t.nextElement())); 
} 
+0

Это возвращает два токена, каждый из которых содержит только пробел. Но Раджа специально спросил о строках, которые содержат только разделители. –

+0

Еще пару очков. 1. Когда вы используете StringTokenizer, вы всегда должны использовать hasMoreTokens() и nextToken(), а не hasMoreElements() и nextElement(). Они доступны только для интерфейса Enumeration. 2. Нет необходимости использовать String.format() так, как вы это делали; PrintStreams, такие как System.out, имеют свои собственные методы format(), а также методы printf() для традиционалистов. :-) –

+0

Thanks Alan, Как вы уже могли догадаться, java не является моим основным языком. Однако я стараюсь стать более опытным. Поэтому я ценю ваши комментарии. –

Смежные вопросы