使用ArrayList拆分方程式

3

如果我输入一个像这样的方程:

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

setOps 列表中有三个还是四个元素? - Martin Tuskevicius
可能需要转义你的 * 吗? - Mr. Polywhirl
1
数组不是以","开始的,而是以空字符串开始的,这是由于您的分割正则表达式引起的。 - qqilihq
在setOps列表中应该只有3个元素,但是当我执行System.out.println(setOps)时,输出变成了[,+,x,/]而不是[+,x,/]。 - user3287300
expr只是一个JTextField()。 - user3287300
@Mr.Polywhirl 我认为他不必在这里转义运算符。大多数元字符在字符类中失去了它们的含义。请参见https://dev59.com/YWsz5IYBdhLWcg3w3r0J - ktm5124
3个回答

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'

第一个字符是分隔符,因此在那里拆分,前面的元素就是拆分后数组的第一个元素。

在您的情况下,您按数字进行了拆分:

9+3*2/1

在9之前,空元素,在+之后...

如果你想查看代码,String.split调用java.util.regex.Pattern.split

在split方法中,你会看到它将index和匹配之间的subStrings添加到ArrayList中,由于第一次迭代时index为零,而且示例中的第一个匹配项是零,因此第一个元素是一个空字符串。从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();
        }
    }

0
额外的空字符串是在您的分割中9之前出现的。 您告诉它要按数字拆分 - 开头和结尾显然会多一个空字符串。
您之所以看不到末尾的额外空字符串,仅仅是因为当您将拆分副本复制到 ArrayList 时,停在了numbers.length
如果数字有多个数字,则此处也会有额外的空字符串。

0

你可以将第二个for循环的起始位置改为i = 1。由于你分割字符串的方式,ops中的第一个元素是空字符串。


如果表达式中的第一件事是一个“-”符号,那可能会成为一个问题。 - Dawood ibn Kareem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接