如何从给定的字符串中“分隔”一个整数?

Posted

技术标签:

【中文标题】如何从给定的字符串中“分隔”一个整数?【英文标题】:How can I "delimit" an integer from a given string? 【发布时间】:2012-11-30 20:31:47 【问题描述】:

我正在做一个练习,我必须从键盘输入一个字符串。该字符串将是简单的算术运算,例如“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 循环中。

【问题讨论】:

使用shunting-yard algorithm 这个问题可能会有所帮助,因为它试图 remove 字符串中的所有数字,我认为您会发现这与使用数字作为分隔符 ***.com/questions/41505028/… 非常相似 【参考方案1】:

如果你想消除数字,留下一个操作数数组,分割字符其他而不是加号或减号:

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

我知道 split() 方法,但是我不想隔离等式中的数字。事实上,我已经使用扫描仪“sc”的分隔符完成了这项工作。我需要隔离的是运算符符号“+”和“-”。我需要消除这些数字。【参考方案3】:

你可以使用下面的代码

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

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

这个拆分返回数组[, +, +, +]

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

【讨论】:

【参考方案4】:

我不会为此使用 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 是一个测试正则表达式的好站点。

【讨论】:

【参考方案5】:

试试这个:

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();

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

【讨论】:

你的程序中有很多 CTE,比如 operand 可能没有初始化,number.toString 中缺少括号,sisWhiteSpace 中应该很小,最终输出将 IndexOutOfBoundException【参考方案6】:

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

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


【讨论】:

只说“这里是您问题的解决方案”的答案并不好,因为它们在帮助 OP 学习和改进方面做得不好。此外,OP 可能希望有人向他们提供解决方案,而只是希望朝着正确的方向轻推,以便他们可以自己实施解决方案。【参考方案7】:
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

【讨论】:

似乎这会将 6 + 2 / 2 回答为 4 而不是 7 只说“这里是您问题的解决方案”的答案并不好,因为它们在帮助 OP 学习和改进方面做得不好。此外,OP 可能希望有人向他们提供解决方案,而只是希望朝着正确的方向轻推,以便他们可以自己实施解决方案。【参考方案8】:

给你,希望对你有帮助...

您即将看到的代码可以求解所有基本方程,这意味着它可以求解包含.+-* 和/ 或 / 等式中的符号。此等式还可以倍数和/或小数。这无法求解包含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

【讨论】:

只说“这里是您问题的解决方案”的答案并不好,因为它们在帮助 OP 学习和改进方面做得不好。此外,OP 可能希望有人向他们提供解决方案,而只是希望朝着正确的方向轻推,以便他们可以自己实施解决方案。

以上是关于如何从给定的字符串中“分隔”一个整数?的主要内容,如果未能解决你的问题,请参考以下文章

python 从字符串中获取整数(空格分隔)

如何将字符串和整数分隔到列表中[关闭]

如何在熊猫中拆分没有给定分隔符的字符串

整数的分隔列表

poj3280Cheapest Palindrome

python如何在给定的字符串中,统计某个特定子串的数量?