Java - после разделения строки, что является первым элементом в массиве?

Я пытался разбить строку на массив из одной буквы. Вот что я сделал,

String str = "abcddadfad"; 
System.out.println(str.length());    //  output: 10  
String[] strArr = str.split("");  
System.out.println(strArr.length);   //  output: 11   
System.out.println(strArr[0]);       // output is nothing 

Новый массив содержал все буквы, однако он не имеет ничего в индексе 0, даже не пробел, но все же увеличил размер моего массива. Может ли кто-нибудь объяснить, почему это происходит?

Ответ 1

Рассмотрим расщепленное выражение ",1,2,3,4".split(",");

Чего вы ожидаете? Правильно, пустая строка для начала. В вашем случае у вас есть "ничего" перед первым "а", а также за ним.

Обновление: комментарии показывают, что этого объяснения недостаточно для объяснения (чего это может быть не так)... но это действительно так просто: двигатель запускается в начале строки, и он смотрит, перед ним соответствует шаблон. Если это так, он присваивает то, что позади, для нового элемента в расколе.

На первом символе у ​​него есть "(ничего позади), и он смотрит, есть ли перед ним" " (шаблон). Существует так, что он создает совпадение.

Затем он движется дальше, и он имеет "а" позади него, и снова он снова имеет "перед ним. Таким образом, вторым результатом является строка" a".

Интересное замечание состоит в том, что если вы используете split("", -1), вы также получите результат с пустой строкой в ​​последней позиции массива результатов.


Отредактируйте 2: Если я еще больше размахиваю мозгами и считаю это академическим упражнением (я бы не рекомендовал это в реальной жизни...) Я могу представить только один хороший способ сделать регулярное выражение split() of a String в массив String[] с 1 символом в каждой строке (в отличие от char [] - который другие люди дали отличные ответы для....).

String[] chars = str.split("(?<=.)", str.length());

Это будет выглядеть позади каждого символа в группе, не связанной с захватом, и разделить на нее, а затем ограничить размер массива количеством символов (вы можете оставить str.length() out, но если вы поместите -1 вы получите дополнительное пространство в конце)

Заимствуя альтернативу nitro2k01 (ниже в комментариях), которая ссылается на начало и конец строки, вы можете надежно разделить на:

String[] chars = str.split("(?!(^|$))");

Ответ 2

Вы можете просто использовать встроенный метод java из класса string. myString.toCharArray() пустая строка хранится с индексом 0

Ответ 3

Мне нужно будет прочитать код, чтобы понять, как "работает" как регулярное выражение. Однако помните, что это соответствует пустой строке... и аргумент является регулярным выражением, а javadoc упоминает, что вызов split (regex) совпадает с вызовом split (regex, 0). Поэтому он не будет пытаться снова сопоставляться, если оставшаяся строка - это все пробелы (или emptystring), поэтому она не соответствует окончательной emptystring после последнего символа.

Лучшей функцией для вызова может быть str.toCharArray();

Ответ 4

Вы также можете попробовать этот способ

String str = "abcddadfad";
System.out.println(str.length());  // output: 10
String[] strArr = new String[str.length()];
for (int i = 0; i < strArr.length; i++) {   

strArr [i] = "" + str.charAt(i);

    // As per  ratchet freak comment: it easier (and more efficient) to use 
     strArr[i] = substring(i,i+1);
}
System.out.println(strArr.length); // output: 10
System.out.println(strArr[0]);     // output: a

Согласно

Ответ 5

Я думаю, что было бы лучше итерации над строковыми символами так:

 use split("");.
for (int i = 0;i < str.length(); i++){
    System.out.println(str.charAt(i));
}