Допоможіть зрозуміти, що у моєму рішенні не влаштовує валідатор
package ua.javarush.task.task34.task3404;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.LinkedList;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
Рекурсія для мат. виразу
*/
public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
solution.recurse("sin(2*(-5+1.5*4)+28)", 0);
// solution.recurse("tan(2025 ^ 0.5)", 0);// Expected output: 0.5 6
}
public void recurse(final String expression, int countOperation) {
//implement
String currentExpression = expression.toLowerCase().replaceAll("\\s+","").replace("--","+");
try {
double finalValue = Double.parseDouble(currentExpression);
NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.ENGLISH);
DecimalFormat df = (DecimalFormat) numberFormat;
df.applyPattern("#.##");
String stringWeNeed = df.format(finalValue);
System.out.println(stringWeNeed + " " + countOperation);
return;
} catch (NumberFormatException e){
//ignore
}
Matcher parentesesMatcher = Pattern.compile("\\([^()]*\\)").matcher(currentExpression);
if(parentesesMatcher.find()) {
String innerExp = parentesesMatcher.group().substring(1, parentesesMatcher.group().length() - 1);
Result innerRes = evaluateExpression(innerExp);
String nextExpression = expression.substring(0, parentesesMatcher.start()) + innerRes.value + expression.substring(parentesesMatcher.end());
recurse(nextExpression, countOperation + innerRes.operations);
return;
}
Result finalResult = evaluateExpression(currentExpression);
recurse(String.valueOf(finalResult.value), countOperation + finalResult.operations);
}
private Result evaluateExpression(String expression) {
int totalOperations = 0;
Pattern funcPattern = Pattern.compile("(sin|cos|tan)(-?\\d+\\.?\\d*)");
Matcher funcMatcher = funcPattern.matcher(expression);
while (funcMatcher.find()){
String func = funcMatcher.group(1);
double value = Double.parseDouble(funcMatcher.group(2));
double radians = Math.toRadians(value);
double resVal = 0;
switch (func){
case "sin": resVal = Math.sin(radians); break;
case "cos": resVal = Math.cos(radians); break;
case "tan": resVal = Math.tan(radians); break;
}
expression = funcMatcher.replaceFirst(String.valueOf(resVal));
funcMatcher = funcPattern.matcher(expression);
totalOperations++;
}
LinkedList<Double> numbers = new LinkedList<>();
LinkedList<Character> operators = new LinkedList<>();
Pattern numberPattern = Pattern.compile("-?\\d+(\\.\\d+)?");
Matcher numberMatcher = numberPattern.matcher(expression);
int lastMathEnd = 0;
while (numberMatcher.find()){
if(numberMatcher.start() > lastMathEnd){
operators.add(expression.charAt(lastMathEnd));
} else if (numberMatcher.start() == 0 && expression.startsWith("-")) {
totalOperations++;
}
numbers.add(Double.parseDouble(numberMatcher.group()));
lastMathEnd = numberMatcher.end();
}
totalOperations += operators.size();
performOperation(numbers, operators, "^");
performOperation(numbers, operators, "*/");
performOperation(numbers, operators, "+-");
return new Result(numbers.getFirst(), totalOperations);
}
private void performOperation(LinkedList<Double> numbers, LinkedList<Character> operators, String opType) {
for (int i = 0; i < operators.size(); i++) {
char op = operators.get(i);
if(opType.indexOf(op) != -1){
double left = numbers.get(i);
double right = numbers.get(i+1);
double result = 0;
switch (op){
case '^': result = Math.pow(left, right); break;
case '*': result = left * right; break;
case '/': result = left / right; break;
case '+': result = left + right; break;
case '-': result = left - right; break;
}
numbers.set(i, result);
numbers.remove(i + 1);
operators.remove(i);
i--;
}
}
}
public Solution() {
//don't delete
}
class Result{
double value;
int operations;
Result(double value, int operations){
this.value = value;
this.operations = operations;
}
}
}