【问题标题】:Converting consecutive digit values in String to Numberic format将字符串中的连续数字值转换为数字格式
【发布时间】:2021-02-21 08:40:59
【问题描述】:

我正在开发计算器应用程序。

我有 CalcLogic 类,它处理 App 中的所有逻辑:

public class CalcLogic {

    private CharacterStack characterStack;
    private DigitStack digitStack;
    private StringStack stringStack;


    public CalcLogic() {
        characterStack = new CharacterStack();
        digitStack = new DigitStack();
        stringStack = new StringStack();
    }

    
    public void convertString(String s) {
        String[] arr = s.split("");


        for (int i = 0; i < arr.length; i++) {
            stringStack.push(arr[i]);
        }

        while (!stringStack.isEmpty()) {
            if ((!stringStack.isEmpty()) && stringStack.peek().matches("[0-9]+")) {
                digitStack.push(Double.valueOf(stringStack.pop()));
            }
            if ((!stringStack.isEmpty()) && stringStack.peek().matches("[(+=\\-*/^)]+")) {
                characterStack.push(stringStack.pop());
            }
        }
        
        System.out.println(digitStack);
        System.out.println(characterStack);
    }

}

得到MainApp:

 public static void main(String[] args) {
        CalcLogic calcLogic = new CalcLogic();
        calcLogic.convertString(new String("1+2*(3+4/2-(1+2))*2+1"));
    }
}

问题在于转换数字:

 if ((!stringStack.isEmpty()) && stringStack.peek().matches("[0-9]+")) {
            digitStack.push(Double.valueOf(stringStack.pop()));
  }

来自String的数字:

String s = "1+2*3(30+4/2-(10+2))*2+1";

将像这样推送到digitStack

1.0 2.0 2.0 1.0 2.0 4.0 [0.0 3.0] 2.0 1.0

因为它会将 String 中的每个元素单独转换。

digitStack 中的预期输出应该是:

1.0 2.0 2.0 1.0 2.0 4.0 30.0 2.0 1.0

我怎样才能实现它?

【问题讨论】:

  • 问题来自String[] arr = str.split("");它逐个字符分割

标签: java string stack


【解决方案1】:

问题来自String[] arr = str.split("");,它逐个字符地拆分。
您可以使用此代码检查它

        String str = "1+2*(3+4/2-(1+2))*2+1";
        String[] arr = str.split("");
        
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }

有关如何使用 java 拆分数学表达式的解决方案,请查看以下 stackoverflow 条目:java-splitting-with-math-expression

String[] arr = str.split("(?<=\\d)(?=\\D)|(?<=\\D)(?=\\d)");

有关split("(?&lt;=\\d)(?=\\D)|(?&lt;=\\D)(?=\\d)") 的详细信息,请阅读stackoverflow 条目:java-splitting-with-math-expression
祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 2022-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多