使用split获取给定String的所有1个字符长子串的数组

时间:2010-12-02 10:52:05

标签: java arrays string

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]

为什么第一个元素为null? 如何在开始时获得一个没有null的数组?

5 个答案:

答案 0 :(得分:9)

第一个参数实际上不是null,它是空字符串""。这是输出的一部分的原因是你拆分空字符串。

分裂的文档说

  

此方法返回的数组包含此字符串的每个子字符串,该子字符串由与给定表达式匹配的另一个子字符串终止,或者以字符串的结尾终止。

输入字符串中的每个位置都以空字符串(包括位置0)开头,因此split函数也会将位置0处的输入拆分。由于第0位没有字符,因此第一个字符串为空字符串元件。

请改为尝试:

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

输出:

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

模式(?<=.)"zero-width positive lookbehind",匹配任意字符(.)。在文字中,它粗略地说“在每个空字符串上分开,前面有一些字符”。

答案 1 :(得分:5)

这是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 :(得分:2)

它不是null,它是一个空字符串。这是一个重要的区别!

您可以使用此构造获得所需内容:

 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)));

但我认为这不是一个好主意。我无法想象为什么要将String拆分为单字母字符串数组。您可能应该使用此代码:

char[] chars = "001100".toCharArray();

答案 3 :(得分:1)

因为“”匹配字符串的开头。它最后也会匹配,但split()会丢弃尾随的空字符串。

答案 4 :(得分:0)

字符串始终以空字符串开头。空字符串不包含任何字符。您可以查看类似的问题here