Java中的.split()做了奇怪的事情

时间:2014-10-26 17:40:08

标签: java arrays string split numbers

我试图将一个包含10个数字和(可能)字母的字符串分开并将它们放入数组中。我知道最好的方法是使用Java提供的.split()函数。我通常不会遇到问题。但是,我现在正在创建一个程序中遇到麻烦。如下面的代码所示,我试图在每个字符处拆分字符串。因此,数组的长度应为10.但是,.split("")函数将字符串的开头计为空格。这导致程序的其余部分出现问题,因为该数组的索引中没有元素。我怎样才能阻止这种情况发生?

String input = "123456789x";
String[] inputArr = input.split("");
System.out.println("Length: " + inputArr.length);
for(int i=0;i<inputArr.length;i++){
    System.out.println(inputArr[i]);
}

此代码产生以下结果:

Length: 11

(空白索引。实际上不在输出中,所以你可以看到它。否则它将是一个空白区域)

1

2

3

4

5

6

7

8

9

x

2 个答案:

答案 0 :(得分:2)

结果开始时的空字符串是正确的(不幸的)行为,因为每个字符串前后都有空字符串,并且使用split("")您决定拆分空字符串。换句话说

"foo"

将在标有|

的地方拆分
"|f|o|o|"

将首先生成数组

["", "f", "o", "o", ""]

但是由于split默认情况下也会删除尾随的空字符串,因此它会返回没有最后一个空字符串的数组,但会将其留在前面

["", "f", "o", "o"]

This behaviour was improved in Java 8所以"foo".split("")会返回["f", "o", "o"]但是如果你想在Java 8之前的版本中得到相同的结果,你需要明确地说要分割每个空字符串除了在其之后/之前有字符串开头的那个。要做到这一点,你可以使用像

这样的环顾四周
yourString.split("(?!^)");

其他替代方法是使用String[]数组代替char[]数组,该数组将保存字符串中的字符。要获得这样的数组,您只需调用:

char[] letters = yourString.toCharArray();

答案 1 :(得分:0)

String[] inputArr = input.split("(?!^)");