2014-01-22 153 views
-2

给定一个包含由空格或逗号分隔的数字的字符串,如何将数字提取到数组中?一个警告是我不确定是否它会把事情分成太多的部分,如果我试图分割空白或逗号。从空格或逗号分隔的字符串中获取数字

Scanner sc = Scanner.(System.IN); 
String input = sc.nextLine(); 
double numbers[] = (double)input.split(",|\s"); 

input的一个例子是

4 5 9 

2,3,7 

8,2 1 

5, 3, 4, 5 

,结果应该是一个包含分配给该数组的元素的每个号码的数组。但以下不应该被允许
4,,2
,1,2,3
4,5,

但是用户可能犯了一个错误输入的东西不是一个字母(而不是1,例如输入“Q”),我想用trycatch但我不确定这是从.split()返回一个数组以来的样子。

+1

的字符串分割()返回String [],这是有据可查的..有什么困惑? – sanbhat

+0

@sanbhat我知道那是什么问题? – Celeritas

+0

from your code expected you double [],所以它更好地重申你的问题,可能的输入和期望的输出清晰 – sanbhat

回答

2

分裂任意数量的空格或逗号,然后分析每一个产生字符串转换成数字:

String[] numberParts = input.split("[\\s,]+"); 
double[] doubles = new double[numberParts.length]; 
int i=0; 
for (String part : numberParts) { 
    double value = Double.parseDouble(part); 
    doubles[i++] = value; 
} 
+0

您能否解释[\\ s,] +背后的逻辑? – Celeritas

+0

@Celeritas - [\\ s,]是一个由所有空白字符(空格,制表符等)和逗号字符组成的字符类。 X +表示X,一次或多次。其含义是一个或多个空格或逗号字符。欲了解更多信息,请参阅模式的javadoc - http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html – radai

+0

谢谢,有一件事不清楚为什么有两个斜线? \ s匹配空格,所以第一个斜杠是做什么的? \\是一个反斜杠(\),那么正则表达式引擎如何知道我们想匹配空白而不是反斜杠? – Celeritas

0

不知道输入的到底是什么或者格式,但是从你刚才所描述的,你将不得不使用split(“”)/ split(“,”)函数的组合,然后通过Double.parseDouble(“1234”)将字符串转换为double。

0

您可以使用这样的事情:

String line="1 2 3 55,56 , 8989 , 88.00 , -76.08 , -6 , +4"; 
String REGEX=" |,"; 
String res[]=line.split(REGEX); 
double numbers[]=new double[res.length]; 
int i=0; 
for(String val:res){ 
    if(!val.isEmpty()&& val.matches("[+-]?\\d+(\\.\\d+)?")) 
     numbers[i++]=Double.parseDouble(val); 
} 
for(int j=0;j<i;j++){ 
    System.out.println(numbers[j]); 
} 

输出

1.0 
2.0 
3.0 
55.0 
56.0 
8989.0 
88.0 
-76.08 
-6.0 
4.0 
2

如何替换所有非数字第一(除分隔符)?最好将分离器设置为1个固定值。

你可以尝试这样的:

//replace ',' with 'space' so that you only have 1 type of separator 
input=input.replaceAll(","," ").replaceAll("[[email protected]#.:;$%?|^\\&*/()+=-]+",""); 
double numbers[] = (double)input.split("\\s"); //or split(" ")