1

我正在编写以下程序来将字符与字符串分开并将其分配给数组。

public class Str {
    public static void main(String[] args) {
        String str = "hello";
        String[] chars = str.split("");
        for (int i = 0; i < chars.length; i++) {
            System.out.println(i + ":" + chars[i]);
        }
    }
}

我得到的输出是:

0:
1:h
2:e
3:l
4:l
5:o

我得到一个空字符串作为数组的第一个元素。我希望输出没有空字符串,并且 chars 数组的长度为 5 而不是 6。为什么拆分此字符串后会出现空字符?

4

3 回答 3

7

您可以使用String#toCharArray()方法:

String str = "hello";
char[] arr = str.toCharArray();

至于你的问题,当你拆分一个空字符串时,你会得到第一个元素作为空字符串,因为你的字符串以一个空字符串开头,并且在每个字符之后也是一个空字符串。

因此,第一个拆分发生在第一个字符之前。

 h e l l o
^ ^ ^ ^ ^ ^
"Split location"

尾随的空字符串将被丢弃,如文档中所述:

因此,尾随的空字符串不包含在结果数组中。

于 2013-07-01T19:02:34.683 回答
4

您是否尝试过课堂上的toCharArray()方法。String

String用 this分割的问题""""匹配字符串中的第一个字符,因此你得到一个空字符。

来验证这个说法。你可以试试str.indexOf("")这将为您提供值 0。根据文档,如果参数不作为子字符串出现,则返回 -1 。

于 2013-07-01T19:04:24.170 回答
1

就像其他人指出的那样, usingtoCharArray()是执行此类操作的首选方法。由于 OP 想知道为什么在 using 时第一个字符串为空split(""),这是因为空字符串是第一个匹配项,甚至在第一个字符被解析之前。根据文档,只有尾随的空字符串被忽略,而不是前导的空字符串。

为了解决这个问题,您可以使用negative look behind。因此,要使用 split 并忽略第一个空字符串,您的正则表达式应该是:

str.split("(?<!^)")

于 2013-07-01T19:32:48.250 回答