使用ArrayList拆分方程式

时间:2014-03-31 22:13:14

标签: java arrays function arraylist

如果我输入如下公式:

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

3 个答案:

答案 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中的第一个元素是一个空字符串。