如果我输入如下公式:
9+3*2/1
我的输出是:
[9,3,2,1]
[,+,*,/]
为什么我的第二个阵列以","开始?以及如何摆脱它以便输出
[+,*,/]
String evaluate(String exp) {
String setExpression = expr.getText();
String[] numbers = setExpression.split("[*/+-]");
String[] ops = setExpression.split("[123456789]");
ArrayList <String> setNumbers = new ArrayList <String>();
ArrayList <String> setOps = new ArrayList <String>();
for(int i=0; i<numbers.length; i++){
setNumbers.add(numbers[i]);
}
for(int i=0; i<numbers.length; i++){
setOps.add(ops[i]);
}
System.out.println(setNumbers);
System.out.println(setOps);
return exp;
}
}
答案 0 :(得分:3)
与您类似的示例:
public class DemoSplit {
public static void main(String[] args) {
String s = ",1,2,";
String su[] = s.split(",");
for (String st: su) System.out.println("'"+st+"'");
}
}
将打印:
''
'1'
'2'
第一个字符是分隔符,因此在那里拆分,之前的元素是esplitted数组的第一个元素。
在你的情况下,你会看到数字:
9+3*2/1
9之前的,空元素,在'+'之后......
如果您想查看代码,String.split会调用java.util.regex.Pattern.split
在split方法中,您将看到将索引与匹配之间的subStrings添加到ArrayList,因为第一次迭代的索引为零,示例中的第一个匹配为零,第一个元素为空字符串。从split方法的源代码:
ArrayList<String> matchList = new ArrayList<String>();
Matcher m = matcher(input);
// Add segments before each match found
while(m.find()) {
if (!matchLimited || matchList.size() < limit - 1) {
String match = input.subSequence(index, m.start()).toString();
matchList.add(match);
index = m.end();
} else if (matchList.size() == limit - 1) { // last one
String match = input.subSequence(index,
input.length()).toString();
matchList.add(match);
index = m.end();
}
}
答案 1 :(得分:0)
额外的空字符串是分割中9之前的字符串。你告诉它要分开数字 - 在开头和结尾都显然是一个额外的空字符串。
您最后没有看到额外空字符串的唯一原因是,当您将拆分复制到ArrayList
时,您会停在numbers.length
。
如果你的数字超过一位,你也会在这里有额外的空字符串。
答案 2 :(得分:0)
你可以改变第二个for循环的开始,所以i = 1.由于你拆分它的方式,ops中的第一个元素是一个空字符串。