有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为计算器拆分输入字符串

我正在尝试拆分用户为我的计算器提供的输入。 例如 如果用户输入“23+45*(1+1)”,我希望将其拆分为[23,+,45,*,(,1,+,1,)]


共 (3) 个答案

  1. # 1 楼答案

    这可能有点草率,因为我还在学习,但它确实将它们分割成了字符串

    公共类TestClass{

    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        ArrayList<String> separatedInput = new ArrayList<String>();
        String input = "";
    
        System.out.print("Values: ");
        input = sc.next();
    
        if (input.length() != 0)
        {
            boolean numberValue = true;
            String numbers = "";
    
            for (int i = 0; i < input.length(); i++)
            {
                char ch = input.charAt(i);
                String value = input.substring(i, i+1);
    
                if (Character.isDigit(ch))
                { numberValue = true; numbers = numbers + value; }
    
                if (!numberValue)
                { separatedInput.add(numbers); separatedInput.add(value); numbers = ""; }
                numberValue = false;
    
                if (i == input.length() - 1)
                {
                    if (Character.isDigit(ch))
                    { separatedInput.add(numbers); }
                }
            }
    
        }
        System.out.println(separatedInput);
     }
    

    }

  2. # 2 楼答案

    你要找的是一个叫lexer的。lexer将输入分割成块(称为标记),您可以读取

    幸运的是,您的lexer非常简单,可以手工编写。对于更复杂的词法分析器,您可以使用^{}(如“快速词法分析器”中的“非Adobe Flex”),或者(因为您使用的是Java)ANTLR(注意,ANTLR不仅仅是一个词法分析器)

    简单地列出一个正则表达式列表,每个标记对应一个正则表达式(请注意,由于您的输入非常简单,您可能可以删除此列表,并将它们全部合并到一个正则表达式中。但是,对于更高级的lexer,为每个标记对应一个正则表达式会有所帮助)

    \d+
    \+
    -
    *
    /
    \(
    \)
    

    然后开始一个循环:当有更多的字符需要解析时,遍历每个正则表达式并尝试将它们与字符串的开头匹配。如果匹配,则将第一个匹配的组添加到输入列表中。否则,继续匹配(如果它们都不匹配,则告诉用户它们有语法错误)

    伪代码:

    List<String>input = new LinkedList<String>();
    while(userInputString.length()>0){
        for (final Pattern p : myRegexes){
            final Matcher m = p.matcher(userInputString);
            if(m.find()) {
                input.add(m.group());
                //Remove the token we found from the user's input string so that we
                //can match the rest of the string against our regular expressions.
                userInputString=userInputString.substring(m.group().length());
                break;
            }
        }
    }
    

    实施说明:

    • 您可能希望在所有正则表达式前面加上^字符。这确保您将匹配项锚定在字符串的开头。我的伪代码假设您已经这样做了
  3. # 3 楼答案

    我认为使用堆栈拆分操作数和运算符并计算表达式更合适。在计算器中,我们通常使用中缀符号来定义算术表达式

    Operand1 op Operand2
    

    检查在许多此类情况下使用的Shunting-yard algorithm来解析数学表达式This也是一本好书