Я настолько не понимаю в чем дело, что даже не понимаю что спросить.
Помогите примером чтобы увидеть что не так.
Или подсказкой почему валидатор не принимает.
package com.javarush.task.task34.task3404;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
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); //expected output 0.5 6
solution.recurse("tan(2025 ^ 0.5)",0); //expected output 1 2
solution.recurse("2^(1 + 3)",0);
solution.recurse("cos(3 + 19*3)",0);
}
public void recurse(final String expression, int countOperation) {
//implement
ArrayList<String> numbersAndOperators = new ArrayList<>();
String expressionInBrackets = expression.indexOf('(') != -1 ? substringBetweenBrackets(expression).replaceAll("\\s", "") : expression.replaceAll("\\s", "");
//expressionInBrackets = expressionInBrackets.indexOf('-') == 0 ? expressionInBrackets.substring(1) : expressionInBrackets;
String ops = "+-*^cst";
String shorterTrigonometry = expressionInBrackets
.replaceAll("cos", "c")
.replaceAll("sin", "s")
.replaceAll("tan", "t");
if(countOperation == 0) {
for (char c : expression.replaceAll("cos", "c").toCharArray()) {
if(ops.indexOf(c) != -1) countOperation++;
}
}
String[] numbersOnly = shorterTrigonometry.split("[s,c,t/^,/*,//,+,/-]");
int i = 0;
for (Character ch : shorterTrigonometry.toCharArray()) {
if (ch == '^' || ch == '*' || ch == '/' || ch == '+' || ch == '-') {
numbersAndOperators.add(numbersOnly[i]);
numbersAndOperators.add(String.valueOf(ch));
i++;
}
else if (ch == 's' || ch == 'c' || ch == 't') {
numbersAndOperators.add(String.valueOf(ch));
numbersAndOperators.add(numbersOnly[i]);
i++;
}
if (i == numbersOnly.length - 1) {
numbersAndOperators.add(numbersOnly[i]);
break;
}
}
// для случая, когда подряю идут два знака
if (numbersAndOperators.contains("")) {
for (int j = 0; j < numbersAndOperators.size(); j++) {
if (numbersAndOperators.get(j).equals("")) {
if (numbersAndOperators.get(j + 1).equals("-")) {
double r = -Double.valueOf(numbersAndOperators.get(j + 2));
numbersAndOperators.set(j + 1, String.valueOf(r));
numbersAndOperators.remove(j + 2);
}
numbersAndOperators.remove(j);
j = 0;
}
}
}
double res = doMaths(numbersAndOperators);
if (expression.contains("(") && expression.contains(")")) {
String shorterExpression = expression.replaceAll("\\s", "").replace("(" + expressionInBrackets + ")", String.valueOf(res));
recurse(shorterExpression, countOperation);
} else {
String k = new BigDecimal(res).setScale(2, RoundingMode.HALF_UP).toString();
k = new DecimalFormat("#.##").format(Double.valueOf(k));
System.out.println(k.replace(",", ".") + " " + countOperation);
return;
}
}
private double doMaths(ArrayList<String> list) {
double res = 0d;
//trigonometric
if (list.contains("s") || list.contains("c") || list.contains("t")) {
double x;
for (int i = 0; i < list.size(); i++) {
switch (list.get(i)) {
case "c":
x = Math.cos(Math.toRadians(Double.valueOf(list.get(i + 1))));
x = i > 0 && list.get(i - 1).equals("-") ? -x : x;
list.set(i, String.valueOf(x));
list.remove(i + 1);
if (i > 0 && list.get(i - 1).equals("-")) {
list.remove(i - 1);
}
break;
case "s":
x = Math.sin(Math.toRadians(Double.valueOf(list.get(i + 1))));
x = i > 0 && list.get(i - 1).equals("-") ? -x : x;
list.set(i, String.valueOf(x));
list.remove(i + 1);
if (i > 0 && list.get(i - 1).equals("-")) {
list.remove(i - 1);
}
break;
case "t":
x = Math.tan(Math.toRadians(Double.valueOf(list.get(i + 1))));
x = i > 0 && list.get(i - 1).equals("-") ? -x : x;
list.set(i, String.valueOf(x));
list.remove(i + 1);
if (i > 0 && list.get(i - 1).equals("-")) {
list.remove(i - 1);
}
break;
}
}
}
//pow
if (list.contains("^")) {
double x;
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("^")) {
double n1 = Double.valueOf(list.get(i - 1));
double n2 = Double.valueOf(list.get(i + 1));
x = Math.pow(n1, n2);
list.set(i - 1, String.valueOf(x));
list.remove(i + 1);
list.remove(i);
i = 0;
}
}
}
//multiply and divide
if (list.contains("*") || list.contains("/")) {
double x;
for (int i = 0; i < list.size(); i++) {
double n1, n2;
switch (list.get(i)) {
case "*":
n1 = Double.valueOf(list.get(i - 1));
n2 = Double.valueOf(list.get(i + 1));
x = n1 * n2;
list.set(i - 1, String.valueOf(x));
list.remove(i + 1);
list.remove(i);
i = 0;
break;
case "/":
n1 = Double.valueOf(list.get(i - 1));
n2 = Double.valueOf(list.get(i + 1));
x = n1 / n2;
list.set(i - 1, String.valueOf(x));
list.remove(i + 1);
list.remove(i);
i = 0;
break;
}
}
}
//+ and -
// Расстановка "минусов"
if (list.contains("-") || list.contains("+")) {
for (int i = 0; i < list.size(); i++) {
double x;
switch (list.get(i)) {
case "-":
x = Double.valueOf(list.get(i + 1)) * -1;
list.set(i + 1, String.valueOf(x));
list.remove(i);
i = 0;
break;
case "+":
x = Double.valueOf(list.get(i + 1));
list.set(i + 1, String.valueOf(x));
list.remove(i);
i = 0;
break;
}
}
}
for(String s : list){
res += Double.valueOf(s);
}
return res;
}
private String substringBetweenBrackets(String expression) {
int lastBrOpen = expression.lastIndexOf('(')+1;
expression = expression.substring(lastBrOpen);
return expression.substring(0, expression.indexOf(')'));
}
public Solution() {
//don't delete
}
}