0

我想从一个简单的数学表达式字符串中提取数字;我首先用空格替换字符串中的所有数学字符,然后尝试用空格拆分字符串,然后将数字放入 ArrayList

public ArrayList<Integer> retriveNumbers(String Expr) {
    ArrayList<Integer> numbers = new ArrayList();
    Expr = Expr.replaceAll("^", " ");
    Expr = Expr.replaceAll("[*]", " ");
    Expr = Expr.replaceAll("/", " ");
    Expr = Expr.replaceAll("[+]", " ");
    Expr = Expr.replaceAll("-", " ");
    Expr = Expr.replaceAll("%", " ");
    String[] elements = Expr.split(" ");
    for(String e : elements){
        numbers.add(Integer.parseInt(e));
    }
    return  numbers;
}

但是当我测试它时,我在输出中给出错误numbers.add(Integer.parseInt(e));

Calculator c1 = new Calculator();
ArrayList<Integer> arr = c1.retriveNumbers("4*5-2+1");
for(int i: arr)
    System.out.println(i);
4

6 回答 6

3

您需要将替换的字符串分配回 Expr-

Expr = Expr.replaceAll("^", " "); // do this for all replacements

并且,还要检查空字符串 -

        if(!e.isEmpty()) {
            numbers.add(Integer.parseInt(e));
        }

就是这样,它将适用于这些更改。

于 2013-03-30T06:55:56.607 回答
2

字符串不可变的,你对它们执行的操作会产生新的结果,所以你需要将它分配给新的字符串

Expr = Expr.replaceAll("^", " ");

对所有其他人也是如此。

顺便说一句,我建议您遵循Java 命名约定并将字符串名称更改为expr(以小写字母开头)并将方法名称更改RetriveNumbers为大写 R。

于 2013-03-30T06:56:53.770 回答
1

试试这个

无需替换每个特殊字符。

您可以简单地将非数字替换为空即

str=str.replaceAll("[^0-9]","");

例子:

 String str="asdfas234234**&^%*&";

      str=str.replaceAll("[^0-9]","");

  System.out.println(str);
于 2013-03-30T06:59:43.903 回答
0

阅读 模式 javadoc

String expression = "4.43*5-2+1";
String expNumbers = expression.replaceAll("[^0-9\\.]", " ");
System.out.println(expNumbers);
于 2013-03-30T07:02:10.440 回答
0

尝试以下一种衬里解决方案。

  expr = expr.replaceAll("[\\^*%\\-+\\\\]", " ");

完整的类将如下面的代码所示。

import java.util.ArrayList;
import java.util.List;

public class Calculator {
    public static void main(String[] args) {
        Calculator c1 = new Calculator();
        List<Integer> arr = c1.retriveNumbers("4*5-2+1");
        for(int i: arr)
            System.out.println(i);
    }

    public List<Integer> retriveNumbers(String expr) {
        List<Integer> numbers = new ArrayList<Integer>();

        expr = expr.replaceAll("[\\^*%\\-+\\\\]", " ");
        String[] elements = expr.split(" ");
        for (String e : elements) {
            numbers.add(Integer.parseInt(e));
        }
        return numbers;
    }

}
于 2013-03-30T07:17:15.280 回答
0

像这样使用

class test
{
public static ArrayList<Integer> retriveNumbers(String Expr){
ArrayList<Integer> numbers = new ArrayList();
String[] elements = Expr.replaceAll("[^0-9]"," ").replaceAll("\\s+"," ").trim().split(" ");;
for(String e : elements){
    numbers.add(Integer.parseInt(e));
}
return  numbers;
}
public static void main(String[] args) 
{
ArrayList<Integer> arr =retriveNumbers("4*5-2+1");
for(int i: arr)
    System.out.println(i);
}
}
于 2013-03-30T07:24:59.050 回答