9

我正在做一个练习,我必须从键盘输入一个字符串。该字符串将是简单的算术运算,例如“2 + 4 + 6 - 8 + 3 - 7”。是的,格式必须是这样的。之间的单个空格。

这个想法是获取这个字符串并最终打印出它的答案。到目前为止,这是我的代码:

public class AddemUp {
  public static void main(String[] args) {
    Scanner kb = new Scanner(System.in);
    System.out.print("Enter something like 8 + 33 + 1345 + 137: ");
    String s = kb.nextLine();
    Scanner sc = new Scanner(s);
    sc.useDelimiter("\\s*\\+\\s*|\\s*\\-\\s*");
    int sum = 0;
    int theInt;
    Scanner sc1 = new Scanner(s);
    sc1.useDelimiter("\\s*\\s*");
    String plusOrMinus = sc1.next();
    int count = 0;
    if(s.startsWith("-"))
    {
        sum -= sc.nextInt();
    }
    while(sc.hasNextInt())
    {
        theInt = sc.nextInt();
        if(count == 0)
        {
            sum += theInt;
        }
        else if(plusOrMinus.equals("+"))
        {
            sum += theInt;
        }
        else
        {
            sum -= theInt;
        }
        sc1.next();
        count++;
    }
    System.out.println("Sum is: " + sum);
    }
  }
}

在“sc1.delimiter”所在的第 25 行,我不知道如何让代码跳过所有整数(以及空格)并仅隔离“+”或“-”。一旦实现了这一点,我可以简单地将其实现到 while 循环中。

4

8 回答 8

4

如果要消除数字,留下操作数数组,拆分除加号或减号以外的字符:

String[] ops = str.split("[^+-]+");

仅供参考,当减号是字符类中的第一个或最后一个时,它是一个字面减号(否则它是一个范围)

于 2014-02-23T05:19:59.433 回答
2

尝试改用split()( JavaDoc ) 方法。这要容易得多。

"8 + 33 + 1345 + 137".split("\\+|\\-")

应该返回一个带有数字的数组。

于 2012-12-13T01:44:06.067 回答
1

您可以使用以下代码

   "8 + 33 + 1345 + 137".split("(\\s\\d*\\s)|(\\s\\d*)|(\\d*\\s)")

这里正则表达式检查字符串中的数字以及它之前/之后/周围的空格。

此拆分返回数组[, +, +, +]

除非字符串以 +/- 开头,否则第一位将始终为空,您可以从 [1] 位置访问数组

于 2018-08-08T13:41:29.330 回答
0

我不会为此使用 Scanner,我会使用模式匹配。它们的相反之处在于扫描程序需要在您想要的字符之间使用分隔符,而模式匹配则标识您想要的字符。

要找到您可以拥有的运营商...

    Pattern p = Pattern.compile("[+-]");
    Matcher m = p.matcher("2 + 4 + 6 - 8 + 3 - 7");
    while (m.find()) {
        String token = m.group(0);
        System.out.println(token);
    }

当数字和运算符一起在循环中时,逻辑可以直接处理。这就是为什么我包括这个。

    Pattern p = Pattern.compile("([^\\s]+)(?:\\s+|$)");
    Matcher m = p.matcher("2 + 4 + 6 - 8 + 3 - 7");
    while (m.find()) {
        String token = m.group(1);
        System.out.println(token);
    }

regex101是一个测试正则表达式的好站点。

于 2019-10-06T03:47:12.970 回答
-1

试试这个:

String str = ...
int total = 0;
int operand;
for(int  i = 0; i < str.length(); i++){
    if(Character.isWhiteSpace(str.charAt(i)))
    ; // empty
    else if(Character.isDigit(str.charAt(i))){
        StringBuilder number = new StringBuilder();
        while(Character.isDigit(str.charAt(i))){
            number.append(str.charAt(i));
            i++;
        }
        operand = Integer.parseInt(number.toString);
    }
    else if(str.charAt(i)) == '+')
        total += operand;
    else if(str.charAt(i)) == '-)
        total -= operand;
    else
        throw new IllegalArgumentException();
}

当然,您应该更好地检查非法条目。我只是给你的想法。

于 2012-12-13T02:34:54.833 回答
-1

下面的代码可以只计算运算符'+'和'-'的序列我希望它有帮助

public class test1 {

public static void main(String[] args) {
    String s= "9-15";
    s=s+"/"; /* add / to execute the last operation */
    String split[]= new String[s.length()];
    for (int i=0;i<split.length;i++){   /* split the string to array */
        split[i]=s.substring(i,i+1);
    }
    String val1="",op="+"; /* val1 : container of the value before the operator to calculate it with total
                              op : the operator between val1 and val2 at the begin is + */
    int som=0;
    for (int i=0;i<split.length;i++){
        try{
            val1=val1+Integer.parseInt(split[i]); /* saving the number after the operation in a string to calculate it,
                                                 a number format exception is throwing when the case don't contain integer*/ 
        }catch(NumberFormatException e){
            if(op.equals("+"))  {
                som=som+Integer.parseInt(val1); /*calculate the total */
                val1=""; /*initialize val1 to save the second number */
                op=split[i]; /* save the operator of the next operation */
            }else{
            if(op.equals("-"))  {
                som=som-Integer.parseInt(val1);
                val1="";
                op=split[i];
            }
        }
        }
    } 
    System.out.println(som);
}
}
于 2015-12-19T22:10:10.297 回答
-2

加油,希望对你有帮助...

您即将看到的代码可以求解所有基本方程,这意味着它可以求解方程中包含.+-*和/或/符号的方程。此等式还可以倍数和/或小数。这无法求解包含 a x^y(x)[x]等的方程。

public static boolean isNum(String e) {
    String[] num=new String[] {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"};
    boolean ret=false;
    for (String n : num) {
        if (e.contains(n)) {
            ret=true;
            break;
        }
    }
    return ret;
}
public static boolean ifMax(String[] e, int i) {
    boolean ret=false;
    if (i == (e.length - 1)) {
        ret=true;
    }
    return ret;
}


public static String getResult(String equation) {
    String[] e=equation.split(" ");
    String[] sign=new String[] {"+", "-", "*", "/"};
    double answer=Double.parseDouble(e[0]);
    for (int i=1; i<e.length; i++) {
        if (isNum(e[i]) != true) {
            if (e[i].equals(sign[0])) {
                double cc=0;
                if (ifMax(e, i) == false) {
                    cc=Double.parseDouble(e[i+1]);
                }
                answer=answer+(cc);
            } else if (e[i].equals(sign[1])) {
                double cc=0;
                if (ifMax(e, i) == false) {
                    cc=Double.parseDouble(e[i+1]);
                }
                answer=answer-(cc);
            } else if (e[i].equals(sign[2])) {
                if (ifMax(e, i) == false) {
                   answer=answer*(Double.parseDouble(e[i+1]));
                }
            } else if (e[i].equals(sign[3])) {
                if (ifMax(e, i) == false) {
                   answer=answer/(Double.parseDouble(e[i+1]));
                }
            }
        }
    }
    return equation+" = "+answer;
}

这是一个例子:

输入:

System.out.println(getResult("1 + 2 + 3 + 4 / 2 - 3 * 6"));

输出:

1 + 2 + 3 + 4 / 2 - 3 * 6 = 12
于 2018-02-22T18:34:28.417 回答
-2
int total = 0;
    final String s = "9 - 15";
    final String[] arr = s.split(" ");
    int i = 0;
    while (i != arr.length)
    {
        switch (arr[i])
        {
            case ("+"):
                total += Integer.parseInt(arr[++i]);
                break;
            case ("-"):
                total -= Integer.parseInt(arr[++i]);
                break;
            case ("*"):
                total *= Integer.parseInt(arr[++i]);
                break;
            case ("/"):
                total /= Integer.parseInt(arr[++i]);
                break;
            default:
                total = Integer.parseInt(arr[i++]);
        }
        if (i == arr.length - 1)
        {
            break;
        }
    }
    System.out.println(total);

希望这可以帮助你....thnx

于 2016-06-10T10:30:36.190 回答