Получение массива всех 1-символьных подстрок данной строки с использованием split - PullRequest
4 голосов
/ 02 декабря 2010
public static void main(String args[]) {
    String sub="0110000";
    String a[]=sub.split("");
    System.out.println(Arrays.toString(a));
}

Я получаю вывод как

[, 0, 1, 1, 0, 0, 0, 0]

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

Ответы [ 5 ]

9 голосов
/ 02 декабря 2010

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

Документация по разделению гласит

Массив, возвращаемый этим методом, содержит каждую подстроку этой строки, которая заканчивается другой подстрокой, соответствующей данному выражению, или заканчивается концом строки.

Каждая позиция в вашей входной строке начинается с пустой строки (включая позицию 0), поэтому функция разделения также разбивает ввод в позиции 0. Поскольку ни один символ не находится перед позицией 0, это приводит к пустой строке для первой элемент.

Попробуйте вместо этого:

String sub = "0110000";
String a[] = sub.split("(?<=.)");
System.out.println(Arrays.toString(a));

Выход:

[0, 1, 1, 0, 0, 0, 0]

Шаблон (?<=.) представляет собой "положительный взгляд нулевой ширины" , который соответствует произвольному символу (.). На словах написано примерно «разбить на каждую пустую строку с каким-нибудь символом перед ней».

5 голосов
/ 02 декабря 2010

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

вместо этого попробуйте toCharArray():

public static void main(String args[])
{
    String sub="0110000";
    char a[]=sub.toCharArray();
    System.out.println(Arrays.toString(a));
}

Я оставлю читателю в качестве упражнения преобразование массива char[] в String[]

.
2 голосов
/ 02 декабря 2010

Это не ноль, это пустая строка. Это важное различие!

Вы можете получить то, что хотите, используя эту конструкцию:

 String[] tokens = "0110000".split("(?<=.)";
 // the (?<=.) means that there must be a character
 // before the match, hence the initial empty string won't match
 System.out.println(Arrays.toString(tokens)));

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

char[] chars = "001100".toCharArray();
1 голос
/ 02 декабря 2010

Потому что "" соответствует началу строки. Он также совпадает в конце, но split() отбрасывает завершающую пустую строку.

0 голосов
/ 02 декабря 2010

Строка всегда начинается с пустой строки. Пустая строка не содержит символов. Подобный вопрос вы можете проверить здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...