2014-12-03 3 views
2

Я пытаюсь разбить строку методом .split() в java. Когда я пытаюсь разбить строку нижеРазделение по метризу не дает правильного ответа

 2000##Test 

Это дает мне массив, содержащий;

 2000,,Test 

Но когда я пытаюсь разбить что-то подобное;

#### 

Это ничего не дает. То, что я хочу, чтобы это

,,,, 

Edit: мой разделитель является #

Как я могу добиться этого.

Добрый день.

Мой Java-код:

String splitString = "2000##1000####"; 
    List<String> splitList = new ArrayList<String>(); 
    String[] splitValues = text.split(splitString,"#"); 
    for (int i = 0;i< splitValues.length;i++){ 
     splitList.add(splitValues[i]); 
    } 
+1

Покажите нам свой код, пожалуйста. –

+1

text.split (splitString, "#"); что не может быть прав? – PDStat

+0

Возможный дубликат [String # split method confusion] (http://stackoverflow.com/questions/22681969/stringsplit-method-confusion) – Baby

ответ

0

Просто дополнение к этому, и я понимаю, что это не вопрос, который вы просили, но это выглядит, как вы хотите, чтобы преобразовать раздвоение массив в список, сделать это вместо того, чтобы цикл у вас есть

String splitString = "####"; 
List<String> splitList = Arrays.asList(splitString.split("#",-1)); 
1

Это известно и документально проблема/поведение. String.split() silently discards trailing separators.

В Javadocs из split() (курсив):

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


Самый простой путь и идти к расщеплению механизм в эти дни является использование Google гуавы-х Splitter.

String input = "####"; 
System.out.println(Splitter.on('#').split(input)); 

выходы:

[, , , , ] 

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

Ваш код показывает, что вы хотите сделать List из полученного массива. Это также легко достижимо:

List<String> splitInput = Splitter.on('#').splitToList(input); 

Вы также можете использовать Apache Commons Lang's StringUtils.splitPreserveAllTokens() для этого:

StringUtils.splitPreserveAllTokens(input, '#'); 

также выводит [, , , , ]

+0

Могу ли я получить его с помощью apache commons? –

+0

Да. Отредактировал его. Во всяком случае, с Splitter вы получаете «Iterable' /' List », что является предпочтительным для массива, и это то, что вы делаете в соответствии с вашим кодом. –

1

Это works как можно было ожидать.

String string = "####"; 
String[] parts = string.split("#",-1); 
System.out.println(Arrays.toString(parts)); 

дает [, , , ,]

Документация говорит «Продольный пустые строки поэтому не включены в результирующий массив.». Метод split() принимает параметр limit, который описан here.

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

1

Если вы используете overload of split that takes an int parameter и передать отрицательное значение, отставая пустые элементы не будут удалены из результирующего массива:

String[] splitValues = splitString.split("#", -1); 

Demo.

Это производит {"2000", "", "1000", "", "", "", ""} массив.

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